创建 RESTful WCF 服务器的原因有很多(这很容易),如果您可以避免使用 ASP 和它的安全框(如果您所做的只是返回信息的简单请求),那就更好了。请参阅:http: //msdn.microsoft.com/en-us/library/ms750530.aspx,了解如何执行此操作。
我发现处理 AJAX (JQUERY) GET 请求很容易。但是在 POST 中处理 JSON 是很棘手的。
下面是一个简单的 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 消息,反序列化为普通 .NET 对象 (PONO) 并让您使用它。事实上,当我在 Fiddler 中构建请求时,这很好用。
POST /BuildToby HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Host: localhost:4326
Content-Length: 1999
但是,当您在 JQUERY 1.8 中使用以下 AJAX 时,您会发现一个惊喜:
通过指定“application/json”的内容类型,您会发现浏览器会触发“预检”检查,以查看是否允许您发布除 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"
});
这是提琴手报告的内容:(请注意,它不是 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,则无用。
所以现在你看到了这个问题(对不起,啰嗦了这么多,但我想把这篇文章写成完整的文章,以便其他人可以关注结果)。