关于”System.ServiceModel.Activation.WebServiceHostFactory“与"<webHttp/>"以及RestFul/启用了Ajax的WCF服务...

本文介绍了如何创建不依赖ASP.NET的WCF AJAX服务。主要包括创建AJAX终结点、创建与AJAX兼容的服务协定及访问AJAX服务等内容。文中详细阐述了如何使用WebServiceHostFactory或配置文件来实现AJAX支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

N久以前,曾看到园子里有一些wcf爱好者总是问:为啥启用了ajax的wcf对应的svc总要加一句Factory=System.ServiceModel.Activation.WebServiceHostFactory

昨天无意在网上闲逛时,发现了msdn官方的解释,转贴于此,希望对大家有帮助:

原文地址: http://msdn.microsoft.com/zh-cn/bb885100.aspx

创建不使用 ASP.NET 的 WCF AJAX 服务

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 请求,将可以访问服务操作,如下面的示例所示。

[OperationContract] string[] GetCities(string firstLetters);
 

此操作可通过对 http://serviceaddress/endpointaddress/GetCities 发出 HTTP POST 请求进行访问,并会返回一条 XML 消息。

可以使用完整的 Web 编程模型来自定义这些基本方面。例如,可以使用 WebGetAttributeWebInvokeAttribute 属性 (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 消息。

{“firstLetters”: “na”, “maxNumber”: 2}
 

下面的协定会接受此消息。

[WebInvoke(BodyStyle=WebMessageBodyStyle.WrappedRequest, ResponseFormat=WebMessageFormat.Json)] [OperationContract] string[] GetCities(string firstLetters, int maxNumber);
 

访问 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

 

转载于:https://www.cnblogs.com/yjmyzz/archive/2008/11/17/1335464.html

### 关于 `System.ServiceModel` 的配置使用 #### 配置 WCF 服务中的 `System.ServiceModel` 在 Windows Communication Foundation (WCF) 中,`System.ServiceModel` 是核心命名空间之一,用于定义所有基本类型和服务模型类。为了正确配置并使用这些功能,在应用程序配置文件(通常是 Web.config 或 App.config 文件)中需设置适当的服务模型部分。 对于 IIS 8 及更高版本上遇到的特定问题——即无法加载 `System.ServiceModel.Activation.HttpModule` 错误[^1],这通常是因为.NET Framework 版本之间的冲突引起。当先安装了 .NET Framework 4 并之后启用.NET Framework 3.5 WCF HTTP 激活时可能出现此类情况[^2]。解决办法可以尝试重新注册 ASP.NET 或者调整应用池框架版本来匹配项目需求。 以下是典型的 `<system.serviceModel>` 配置片段: ```xml <configuration> <system.serviceModel> <!-- 定义绑定 --> <bindings> <basicHttpBinding> <binding name="BasicHttpEndpointBinding"> <security mode="None"/> </binding> </basicHttpBinding> </bindings> <!-- 设置服务行为 --> <behaviors> <serviceBehaviors> <behavior name="DefaultBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <!-- 注册服务端点 --> <services> <service behaviorConfiguration="DefaultBehavior" name="YourNamespace.YourServiceClass"> <endpoint address="" binding="basicHttpBinding" contract="YourNamespace.IYourServiceContract" /> <!-- 如果需要元数据交换支持 --> <endpoint kind="mexEndpoint" address="mex" /> </service> </services> <!-- 启用诊断追踪(可选) --> <diagnostics wmiProviderEnabled="true"> <messageLogging logEntireMessage="true" maxMessagesToLog="300" maxSizeOfMessageToLog="2000"/> </diagnostics> </system.serviceModel> </configuration> ``` 这段 XML 展示了一个基础的 WCF 服务配置实例,其中包含了如何指定绑定、行为以及暴露给客户端访问的具体终结点地址等信息。通过修改上述参数能够满足不同场景下的通信需求。 另外值得注意的是,在某些情况下可能会遭遇协议级别的异常,比如读取消息格式失败或安全协商错误等问题。针对前者可能是由于消息体不完整造成的;而后者则往往涉及到身份验证机制上的差异[^3][^4]。面对这类状况建议仔细审查日志记录,并依据具体提示采取相应的措施加以修复。 最后关于 Core 应用部署过程中缺失 `System.Private.ServiceModel.dll` 的情形,确保随同其他依赖项一同发布至目标环境是非常重要的一步操作[^5]。特别是跨平台开发环境下更应关注运行库兼容性方面的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值