У меня возникли проблемы с загрузкой jquery, чтобы опубликовать некоторые данные json для метода rest, который у меня есть в моей службе WCF.
На стороне 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 не POST
- тип содержимого (на другой вкладке) показывает
text/html; charset=UTF-8
вместо json - данные JSON не могут быть замечены
Однако, если я изменю запрос в Charles, чтобы его заголовки были похожи на решение здесь, тогда все работает:
POST /MyService/PostSomething HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost
Content-Length: 152
{"Id":"", "Name":"testspot","Description":"test" }
глядя на учебные пособия и другие вопросы, здесь другие смогли получить JQuery для публикации в методе REST WCF, подобном этому, и я не понимаю, что я здесь делаю неправильно.
oh, чтобы поместить некоторый контекст, это служба WCF 4, и я использую JQuery 1.4.4.
Спасибо,
UPDATE:
После некоторого большего чтения и спасибо Darrel за то, что он указал мне на междоменную спецификацию, мне удалось немного улучшить некоторые мои изменения в сервисе:
[OperationContract]
[WebInvoke(Method = "*",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "PostSomething")]
MyResult PostSomething(MyRequest request);
и в реализации мне нужно проверить, есть ли входящие запросы для OPTIONS, и в этом случае вернуть некоторые заголовки, а не выполнять намеченную работу:
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, и сервер идет вперед и обычно обрабатывает запрос.