我在使用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