尝试使用 XHR 联系 WCF 服务时出现 400 错误请求

Posted

技术标签:

【中文标题】尝试使用 XHR 联系 WCF 服务时出现 400 错误请求【英文标题】:400 Bad request when trying to contact WCF service using XHR 【发布时间】:2011-12-07 11:39:27 【问题描述】:

我正在创建一个将返回 json 对象的 WCF Web 服务,但是当我尝试进行 AJAX 调用时,我不断收到 400 bad request 错误:

OPTIONS http://localhost:55658/WebServiceWrapper.svc/GetData?_=1318567254842&value=97            HTTP/1.1
Host: localhost:55658
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
Origin: http://localhost:3000
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type

HTTP/1.1 400 Bad Request
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 14 Oct 2011 04:40:55 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Length: 0
Connection: Close

这是我的 AJAX 调用:

$.ajax(
  contentType: 'application/json',
  url: 'http://localhost:55658/WebServiceWrapper.svc/GetData',
  dataType: 'json',
  data: 
    value: 97
  ,
  success: function (data) 
    alert('success' + data);
  ,
  error: function(XMLHttpRequest, textStatus, errorThrown) 
    alert('failure' + errorThrown);
  
);

这是我的 WCF 服务定义:

public class WebServiceWrapper : IWebServiceWrapper

    public object GetData(int value)
    
        return new 
        
            ReturnValue = string.Format("You entered: 0", value)
        ;
    

它的界面:

[ServiceContract]
public interface IWebServiceWrapper

    [OperationContract]
    object GetData(int value);

我知道我以前解决过这个问题,但我不记得我以前做过什么。任何帮助将不胜感激,因为我在墙上的洞越来越大。

【问题讨论】:

您确定在 ajax 调用中使用的端口号 (55658) 吗?来源报告为 3000。 【参考方案1】:

您可能需要做几件事(或检查您是否已完成):

您的 GetData OperationContract 需要使用 [WebGet] 属性进行修饰。


    [WebGet]
    [OperationContract]
    object GetData(int value);

您的 WebServiceWrapper 类需要使用 [AspNetCompatibilityRequirements] 属性进行修饰(添加对 System.ServiceModel.Web 的引用以使其可用)


    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class WebServiceWrapper : IWebServiceWrapper

GetData 操作的返回值需要被包装。一种简单的方法是使用 javascriptSerializer 将对象序列化为 json


    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(new
                                
                                    ReturnValue = string.Format("You entered: 0", value)
                                );

您需要确保在端点(客户端和服务)中使用 [webHttpBinding]

<endpoint ... binding="webHttpBinding" ... />

我不知道接下来这件事是否是强制性的,但您可能需要一个启用 Web 脚本的端点行为

<endpointBehaviors>
    <behavior name="[endpointBehaviorName]">
        <enableWebScript/>
    </behavior>
</endpointBehaviors>

您显然需要在端点中引用此行为配置

<endpoint ... behaviorConfiguration="[endpointBehaviorName]" ... />

【讨论】:

【参考方案2】:

查看您的请求,您正在发出 OPTIONS 请求而不是 GET,如果您尝试执行跨站点 XHR 请求,我认为 jQuery 会自动执行此请求,请参阅以下问题:

Why am I getting an OPTIONS request instead of a GET request?

我什至不确定您的服务器是否支持 OPTIONS 方法,因此出现了 400 错误。

即使是不同的端口号也被认为是跨站点请求,因此您最好在向您的 WCF 服务发出 HTTP 请求的实际网站上创建一个代理页面。

【讨论】:

【参考方案3】:

您似乎违反了same origin policy restriction。您不能发送跨域 AJAX 请求。您的应用程序托管在 http://localhost:3000 上,并且您正尝试向 http://localhost:55658 发送 AJAX 请求。这不可能。您只能向 http://localhost:3000 发送 AJAX 请求。您可以使用JSONP 来规避此限制。这是 MSDN 上的 another article。

【讨论】:

以上是关于尝试使用 XHR 联系 WCF 服务时出现 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

在 wcf rest 中发送 xml 请求时出现错误请求 400

点击发送请求时出现 Cypress 400 XHR 错误

尝试在 mailchimp 中添加联系人时出现错误 400

传递流时出现 Wcf Rest Service 错误

尝试使用 WCF 服务时出现 System.Net.WebException

尝试发布到 wcf rest 4 服务时出现错误请求