Добавьте это в Global.asax.cs (если у вас нет этого файла в вашем решении, создайте его следующим образом: Добавить новый элемент => Visual C # => Global Application Class (имя по умолчанию - «Global.asax»)):

я возникли проблемы с получением 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 Not Allowed каждый раз), и, глядя на Чарльза, запрос выглядит так:

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

пара странных вещей об этом:

метод ВАРИАНТЫ НЕ ПОЧТАтип контента (в другой вкладке) показывает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 публиковать в методе WCF REST вот так, и я не понимаю, что я делаю здесь неправильно ..

о, если говорить немного, это сервис WCF 4, и я использую JQuery 1.4.4.

Спасибо,

ОБНОВИТЬ:

После дополнительного чтения и благодарности Даррелу за то, что он указал мне на междоменную спецификацию, мне удалось продвинуться немного дальше, внеся некоторые небольшие изменения в мой сервис в интерфейсе сервиса:

[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;
}

затем метод вызывается дважды, в первый раз сервер возвращает ноль, но добавляет некоторые заголовки клиенту, а затем фактический запрос выполняется с использованием метода POST в качестве метода, и сервер продолжает работу и обрабатывает запрос в обычном режиме.

Ответы на вопрос(5)

Ваш ответ на вопрос