N久以前,曾看到园子里有一些wcf爱好者总是问:为啥启用了ajax的wcf对应的svc总要加一句Factory=System.ServiceModel.Activation.WebServiceHostFactory
昨天无意在网上闲逛时,发现了msdn官方的解释,转贴于此,希望对大家有帮助:
原文地址: http://msdn.microsoft.com/zh-cn/bb885100.aspx
Windows Communication Foundation (WCF) AJAX 服务可以从任何支持 Javascript 的网页进行访问,而不需要使用 ASP.NET AJAX。本主题描述如何创建此类 WCF 服务。
有关如何将 WCF 与 ASP.NET AJAX 一起使用的说明,请参见为 ASP.NET AJAX 创建 WCF 服务。
创建 WCF AJAX 服务包括三个部分:
- 创建一个可以从浏览器中访问的 AJAX 终结点。
- 创建一个与 AJAX 兼容的服务协定。
- 访问 WCF AJAX 服务。
创建 AJAX 终结点
若要在 WCF 服务中启用 AJAX 支持,最基本的方法是在与服务关联的 .svc 文件中使用 WebServiceHostFactory,如下面的示例所示。
<%ServiceHost language=c# Debug="true" Service="Microsoft.Ajax.Samples.CityService" Factory=System.ServiceModel.Activation.WebServiceHostFactory %> |
另外,也可以使用配置来添加 AJAX 终结点。在服务终结点上使用 WebHttpBinding,并使用 WebHttpBehavior 配置该终结点,如下面的代码段所示。
<configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="AjaxBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> <services> <service name="Microsoft.Ajax.Samples.CityService"> <endpoint address="ajaxEndpoint" behaviorConfiguration="AjaxBehavior" binding="webHttpBinding" contract="Microsoft.Ajax.Samples.ICityService" /> </service> </services> </system.serviceModel> </configuration> |
有关可运行示例,请参见AJAX Service with JSON and XML Sample。
创建与 AJAX 兼容的服务协定
默认情况下,通过 AJAX 终结点公开的服务协定将以 XML 格式返回数据。而且,默认情况下,通过对包含跟有操作名称的终结点地址的 URL 发出 HTTP POST 请求,将可以访问服务操作,如下面的示例所示。
此操作可通过对 http://serviceaddress/endpointaddress/GetCities 发出 HTTP POST 请求进行访问,并会返回一条 XML 消息。
可以使用完整的 Web 编程模型来自定义这些基本方面。例如,可以使用 WebGetAttribute 或 WebInvokeAttribute 属性 (Attribute) 来控制操作响应的 HTTP 谓词,或使用各个属性 (Attribute) 的 UriTemplate 属性 (Property) 来指定自定义 URI。有关更多信息,请参见 Web 编程模型主题。
AJAX 服务中经常使用 JSON 数据格式。若要创建返回 JSON 而非 XML 的操作,请将 ResponseFormat(或 ResponseFormat)属性设置为 Json。独立 JSON 序列化主题演示了内置 .NET 类型和数据协定类型如何映射到 JSON。
通常,JSON 的请求和响应只包括一项。对于上面的 GetCities 操作,该请求将类似于以下语句。
|
“na” |
该请求的响应类似于以下语句。
|
[“Nairobi”, “Naples”, “Nashville”] |
如果该操作使用了额外的参数,则请求样式必须是“包装的”,以便将两个参数都包装在一个 JSON 对象中。下面的示例显示了这种样式的 JSON 消息。
下面的协定会接受此消息。
访问 AJAX 服务
WCF AJAX 终结点始终接受 JSON 和 XML 请求。
内容类型为“application/json”的 HTTP POST 请求将被视为 JSON,而内容类型指示 XML(例如“text/xml”)的 HTTP POST 请求将被视为 XML。
HTTP GET 请求的所有请求参数都包含在 URL 本身中。
用户将负责决定如何创建对终结点的 HTTP 请求。另外,用户还可以完全控制如何构造构成请求主体的 JSON。有关通过 JavaScript 创建请求的示例,请参见AJAX Service with JSON and XML Sample。