首先,由于您不想依赖 Microsoft Ajax ScriptManager,因此不要在 endpointBehaviors/behavior 中使用 <enableWebScript />。它是 Microsoft 特定的 JSON。
然而,幸运的是,WCF 使您的客户端可以很容易地决定他们需要 XML 还是通用 JSON。
使用<webHttp />行为。
<endpointBehaviors>
<behavior name="My.WcfServices.webHttpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
如Damian Mehers 的博客 WCF REST Services中所述,创建自定义 WebServiceHost 和自定义属性特性
。在 Mehers 的代码中,类型由请求内容类型决定。您可能希望扩展它以检查 URL,例如 .xml 或 .json 或 ?format=xml|json。
在SerializeReply方法中,检查 URL。
消息请求 = OperationContext.Current.RequestContext.RequestMessage;
Uri url = request.Properties["OriginalHttpRequestUri"] as Uri;
// 检查 ?format 查询字符串
System.Collections.Specialized.NameValueCollection colQuery = System.Web.HttpUtility.ParseQueryString(url.Query);
字符串 strResponseFormat = colQuery["format"];
// 或者检查扩展
字符串 strResponseFormat = url.LocalPath.Contains(".json") ?“json”:“xml”;
定义你的方法
[OperationContract]
[WebGet(UriTemplate="Hello.{responseFormat}")] // 或 "Hello?format={responseFormat}"
[DynamicResponseType]
public string Hello(string responseFormat)
{
return "Hello World";
}
示例 URL:
http://localhost/myrest.svc/Hello.xml
http://localhost/myrest.svc/Hello.json
或
http://localhost/myrest.svc/Hello?format=xml
http://localhost /myrest.svc/Hello?format=json
- JSON 和 XML 都易于跨浏览器使用。诸如用于 JSON 的 jQuery 和用于 XML 的 Sarissa 之类的库使其变得更加容易。
注意:如果您看到错误“找不到与具有绑定 WebHttpBinding 的端点的方案 http 匹配的基地址。”,添加baseAddressPrefixFilters元素并将 localhost(或任何您的域)添加到 IIS 主机头名称。
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://localhost"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>