我正在制作一个返回json对象的WCF Web服务,但是当我尝试进行AJAX调用时,我一直收到400错误的请求错误:
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);
}
我知道我之前已经解决了这个问题,但我不记得以前做过什么。任何帮助都会非常感激,因为我放在墙上的洞越来越大。
答案 0 :(得分: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]" ... />
答案 1 :(得分:0)
查看您的请求,您正在发出OPTIONS请求而不是GET,我认为如果您尝试执行跨站点XHR请求,jQuery会自动执行此操作,请参阅此问题:
Why am I getting an OPTIONS request instead of a GET request?
我甚至不确定您的服务器是否支持OPTIONS方法,因此您的400错误。
即使不同的端口号被视为跨站点请求,因此您最好在实际网站上创建一个代理页面,向您的WCF服务发出HTTP请求。
答案 2 :(得分:0)
您似乎违反了same origin policy restriction。您无法发送跨域AJAX请求。您的应用程序托管在http://localhost:3000
上,并且您正尝试向http://localhost:55658
发送AJAX请求。这不可能。您只能向http://localhost:3000
发送AJAX请求。您可以使用JSONP来规避此限制。这是MSDN上的another article。