【发布时间】:2011-05-31 19:51:41
【问题描述】:
我正在开发我的第一个 WCF 服务,它将支持多个 Ajax 调用。我有一个这样配置的端点:
<service behaviorConfiguration="ServiceBehavior" name="AQM">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="Binding1" contract="IAQM" />
</service>
和我的行为配置:
<endpointBehaviors>
<behavior name="web">
<webHttp />
<enableWebScript />
</behavior>
</endpointBehaviors>
我需要创建自己的错误处理,以便我可以将一些特定信息格式化回客户端(请参阅此处http://zamd.net/2008/07/08/error-handling-with-webhttpbinding-for-ajaxjson/)。我的 WebServiceHostFactory 看起来像这样:
public class MyServiceFactory : WebServiceHostFactory
{
public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
{
var sh = new ServiceHost(typeof(AQM), baseAddresses);
sh.Description.Endpoints[0].Behaviors.Add(new WebHttpBehaviorEx());
return sh;
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return base.CreateServiceHost(serviceType, baseAddresses);
}
}
public class WebHttpBehaviorEx : WebHttpBehavior
{
protected override void AddServerErrorHandlers(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
// Clear default error handlers
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
// Add our own error handler
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new ErrorHandlerEx());
}
但是,在我创建自己的错误处理程序之后,它似乎覆盖了我在上面的配置中的“enableWebScript”设置,我认为这是有道理的,因为现在我正在动态创建自己的行为,而没有上面的任何配置设置。
我了解到,出于安全目的,此设置应与 WCF/Ajax 一起使用(请参阅此处http://www.asp.net/ajaxlibrary/Using%20JSON%20Syntax%20with%20Ajax.ashx)。所以我的问题是,如何在动态创建的行为上设置“enableWebScript”设置?还是不可能?
更新(2011 年 6 月 1 日):我还希望动态更改行为以使用 Windows 凭据进行身份验证。在配置文件中是这样完成的:
<bindings>
<webHttpBinding>
<binding name="Binding1">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</webHttpBinding>
</bindings>
这是我需要以编程方式进行的另一个设置,因为它似乎忽略了配置设置。
【问题讨论】:
-
您不应该在同一端点上同时需要
和 行为。前者是任何支持 REST 的 WCF 端点的通用行为;后者专门用于创建支持 REST 的端点,供 ASP.NET AJAX 客户端使用。 -
好的,谢谢卡洛斯。我目前只使用 enableWebScript 来实现您所说的目的。我的目标是找到一种在创建新行为时在某处动态设置此行为属性的方法。你知道这样做的方法吗?
-
您可以按照 Joel C 所述以编程方式添加行为。但是,WebScriptEnablingBehavior 是密封的,因此您无法真正扩展它。只是为了确认一下,您是在 ASP.NET 应用程序中使用 AJAX,还是真的在使用 ASP.NET AJAX(名称相似,技术不同:)? ASP.NET AJAX 意味着使用
来管理 HTML/JS 页面中的脚本。 -
不,不通过 ASP.NET 使用 AJAX,也没有 ASP.NET 控件。我有一个基于 jQuery 的 UI,可以对 WCF 服务进行 AJAX 调用。 enableWebScript 是 WebScripEnablingBehavior 类中的属性吗?就像我对 Joel 的回应一样,当它创建服务主机时,我的 Properties 集合中似乎已经有一个 WebScriptEnablingBehavior 对象,但是我找不到与 enableWebScript 等效的程序。
标签: wcf endpoint webhttpbinding