我在使用jquery将一些json数据发布到我的WCF服务中的休息方法方面遇到了一些麻烦。将JSON数据从JQuery发送到WCF REST方法时出现问题
在WCF侧,这里的经营合同:
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "PostSomething")]
MyResult PostSomething(MyRequest request);
两个MyResult
和MyRequest
都标有所有必要的DataContract
和DataMember
属性和服务被暴露WebHttp端点。
了jQuery的一面,这是我的函数调用:
var jsonStr = JSON.stringify(reqObj);
$.ajax({
type: "POST",
dataType: "json",
url: "http://localhost/MyService/PostSomething",
contentType: "application/json; charset=utf-8",
data: jsonStr,
success: function (html) {
alert(html);
}
});
这一要求从来没有达到我的方法(我得到一个405不允许的方法每次),并期待在查尔斯的要求是这样的:
OPTIONS /MyService/PostSomething HTTP/1.1
Host: localhost
Cache-Control: max-age=0
Access-Control-Request-Method: POST
Origin: null
Access-Control-Request-Headers: Content-Type, Accept
Accept: */*
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
几件事情是奇怪的:
- 的方法OPTIONS无法发布
- 内容类型(在其他标签)表示
text/html; charset=UTF-8
代替JSON - JSON数据被没有在那里可以看出
但是,如果我修改查尔斯请求,使得它的头是相似该解决方案here,然后一切正常:
POST /MyService/PostSomething HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost
Content-Length: 152
{"Id":"", "Name":"testspot","Description":"test" }
看着教程和其他在这里的问题别人设法让jQuery来张贴到WCF REST方法这个样子,和我在一个无所适从我在这里做错了。
哦,放一些上下文,这是一个WCF 4服务,我使用JQuery 1.4.4。
感谢,
UPDATE:
一些更多的阅读和感谢达雷尔指着我对跨域规范后,我设法通过进行一些小的修改,以进一步得到一点我的服务,服务接口:
[OperationContract]
[WebInvoke(Method = "*",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "PostSomething")]
MyResult PostSomething(MyRequest request);
,并在实施中,我需要检查,如果传入的请求是OPTIONS在这种情况下,返回一些头,而不是做intende d工作:
if (WebOperationContext.Current.IncomingRequest.Method == "OPTIONS")
{
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "POST");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept");
return null;
}
于是,该方法被调用了两次,第一次在服务器返回null,但增加了一些头到客户端,然后实际的请求是由具有POST作为方法和服务器继续运行并交易正常请求。
我非常爱你!非常!!!干杯!!! 我不得不在Windows服务应用程序中托管WCF。方法GET工作,但POST从来没有工作,直到我得到方法=“*”使事情工作。在我的情况下,该方法不会被调用两次! – 2014-07-12 07:33:28
似乎没有在这里工作..你可以把一个完整的例子在线? – 2015-04-29 09:37:37