Существует множество причин создания RESTful WCF-сервера (это легко), и даже лучше, если вы можете избежать ASP и его безопасности (если все, что вы делаете, это простые запросы на возврат информации). См. http://msdn.microsoft.com/en-us/library/ms750530.aspx о том, как это сделать.
Я обнаружил, что обработка запросов AJAX (JQUERY) GET очень проста. Но работать с JSON в POST сложно.
Вот пример простого контракта на поставку GET:
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
String Version();
И реализация здесь (которая возвращает JSON)
public partial class CatalogService : ICatalogService
{
public String Version()
{
mon.IsActive = true;
this.BypassCrossDomain();
ViewModel.myself.TransactionCount++;
return ViewModel.myself.VersionString;
}
}
А, а что, если вы хотите ПОЧТИ какой-то JSON. Вы найдете много статей о переполнении стека, которые расскажут вам все, что вам нужно сделать, это следующее:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
BuildResponse BuildToby(BuildRequest request);
который получит сообщение JSON, де-сериализуется в объект Plain.NET(PONO) и позволит вам работать с ним. И действительно, это сработало хорошо, когда я построил запрос в Fiddler.
POST /BuildToby HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Host: localhost:4326
Content-Length: 1999
Однако, когда вы используете следующий AJAX в JQUERY 1.8, вы найдете SURPRISE:
Он, указав тип содержимого "application/json", вы обнаружите, что есть проверка "предполетного" кода, которая отключена браузером, чтобы узнать, разрешено ли вам POST что-либо, кроме www-url-encloded сообщение. (есть примечания в переполнении стека об этом).
var request = JSON.stringify({ FrameList: ExportData.buildList });
var jqxhr = $.ajax({
type: "POST",
url: "http://localhost:4326/BuildToby",
data: request,
contentType: "application/json; charset=utf-8",
dataType: "json"
});
и вот что сообщает fiddler: (Обратите внимание, что это не сообщение POST, а сообщение OPTIONS).
OPTIONS http://localhost:4326/BuildToby HTTP/1.1
Host: localhost:4326
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
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
Origin: http://ysg4206
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Что случилось, так это то, что браузер (в данном случае Firefox) должен сделать дополнительный вызов на сервер с помощью сообщения OPTIONS HTTP, чтобы узнать, разрешен ли POST (этого типа контента).
Все статьи об исправлении этого вопроса касаются редактирования GLOBAL.ASAX, который хорош, если вы находитесь в ASP.NET, но бесполезны, если вы делаете самостоятельный хост WCF.
Итак, теперь вы видите вопрос (извините за то, что вы так долго наматывались, но я хотел сделать это полной статьей, чтобы другие могли следить за результатами).