我正在开发我的第一个 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>
这是我需要以编程方式进行的另一个设置,因为它似乎忽略了配置设置。