【问题标题】:Calling an ASP.NET 4.0 WCF service from jQuery yields 400 Bad Request从 jQuery 调用 ASP.NET 4.0 WCF 服务会产生 400 Bad Request
【发布时间】:2026-01-24 00:50:01
【问题描述】:

我知道这个问题似乎已经发布了很多次,但我几乎阅读了所有这些(互联网上的大部分教程),但我仍然无法理解我做错了什么。

我试图在一个网站中实现我们正在开发一个由 jQuery 脚本使用的 WCF Web 服务,但是在执行 AJAX 请求时我不断收到400 Bad Request,我开始失去希望了。

请注意,我是 WCF 的新手,而且我只是通过在线教程才形成自己的,所以我完全有可能忽略或搞砸了一些事情。

我试过但没有帮助的问题:

我阅读的外部资源无济于事:

我也尝试创建一个新的解决方案,只有一个页面和服务,以排除干扰,但我仍然遇到同样的问题。在这里你可以找到代码:

IService.cs

namespace WebService
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;

    [ServiceContract(Name = "Service", Namespace = "WebService")]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        String Test();
    }
}

Service.svc.cs

namespace WebService
{
    using System;

    public class Service : IService
    {
        public String Test()
        {
            return "Hello, world.";
        }
    }
}

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebService.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                $("#doAjax").click(function (event) {
                    event.preventDefault();
                    jQuery.ajax({
                        contentType: "application/json"
                        , dataType: "text"
                        , error: function (jqXHR, textStatus, errorThrown) {
                            console.group("AJAX error:");
                            console.debug(jqXHR);
                            console.debug(textStatus);
                            console.groupEnd();
                        }
                        , processData: false
                        , success: function (data, textStatus, jqXHR) {
                            console.group("AJAX success:");
                            console.debug(data);
                            console.debug(textStatus);
                            console.debug(jqXHR);
                            console.groupEnd();
                        }
                        , type: "post"
                        , url: "/Service.svc/Test"
                    });
                });
            });
        </script>
        <title>WebService</title>
    </head>
    <body>
        <form runat="server">
            <h1><%= this.Page.Title %></h1>
            <p><input id="doAjax" type="button" value="Run" /></p>
        </form>
    </body>
</html>

Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>
        <bindings />
        <client />
        <behaviors>
            <endpointBehaviors>
                <behavior name="Behavior">
                    <webHttp />
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
        <services>
            <service name="Service">
                <endpoint behaviorConfiguration="Behavior" binding="webHttpBinding" contract="WebService.IService" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

【问题讨论】:

  • 你想出这个问题的答案了吗?我遇到了同样的问题,找不到解决方案... :(
  • @NaveedButt 不,我后来转到其他项目。试试下面的答案,如果你能做到,请发布答案/评论,以便其他人知道该怎么做。
  • 我可以通过在页面中放置一个 div 并将其 html 设置为 jqXHR 来查看有关错误的更多详细信息,以防引发错误。这样我就得到了更好的输出。当我找到一个 IA 时,我会在这里发布一个解决方案。
  • 我发现了错误,它与我的javascript有关。我用来调用服务的jquery.ajax 方法出现了一些错误。

标签: jquery asp.net ajax wcf c#-4.0


【解决方案1】:

服务名称必须是完全限定的。试试看:&lt;service name="WebService.Service"&gt;

【讨论】:

    【解决方案2】:

    嘿!我遇到了同样的问题(......再次)但最终想通了并让它正常工作。

    现在这是我自己的例子,但因为它对我有用,希望它也对你有用......我忘记的关键行在我的 $ajax 命令中:

    contentType: "application/json; charset=utf-8"
    

    祝你好运:)我在这个问题上花了半天时间。

    界面:

    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json)]
    int CreateMilestone(Milestone Input);
    

    类:

    [DataContract]
    public class Milestone
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Date { get; set; }
        [DataMember]
        public int Risk { get; set; }
        [DataMember]
        public int Complexity { get; set; }
    }
    

    方法:

       public int CreateMilestone(Milestone Input)
        {
            return 0;
        }
    

    jquery:

    $("#btnSubmit").click(function () {
    
        if ($.trim($("#txtName").val()) == "") {
            $("#dName").effect("highlight", 500);
        }
        else {
    
            var date = $("#txtDate").datepicker("getDate");
            var data = {
                Name: $("#txtName").val(),
                Date: (date.getMonth() + 1) + "-" + date.getDate() + "-" + date.getFullYear(),
                Risk: parseInt($("#sRisk").text()),
                    Complexity: parseInt($("#sComplexity").text())
                };
                var jsondata = JSON.stringify(data);
                $.ajax({
                    type: "POST",
                    async: false,
                    url: 'Services/ProjectService.svc/CreateMilestone',
                    contentType: "application/json; charset=utf-8",
                    data: jsondata,
                    dataType: "json",
                    success: function (msg) {
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        //                        alert(XMLHttpRequest.status);
                        //                        alert(XMLHttpRequest.responseText);
                    }
                });
            }
        });
    

    【讨论】:

      最近更新 更多