1

我正在开发我的第一个 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>

这是我需要以编程方式进行的另一个设置,因为它似乎忽略了配置设置。

4

2 回答 2

1

对我来说,在 WebHttpBehaviorEx 中添加以下构造函数后它起作用了

    public  WebHttpBehaviorEx()
    {
        DefaultBodyStyle = WebMessageBodyStyle.Wrapped;
        DefaultOutgoingRequestFormat = WebMessageFormat.Json;
        DefaultOutgoingResponseFormat = WebMessageFormat.Json;
    }
于 2011-11-07T12:51:42.657 回答
0

WebScriptEnablingBehavior您应该能够以编程方式在实例中创建一个类并将其添加到Behaviors端点的集合中。我从来没有尝试过,也不知道在一个端点上定义多个行为究竟是如何工作的,但我认为这基本上就是你在声明性配置中所做的。不幸的是WebScriptEnablingBehavior(继承自WebHttpBehavior)是密封的,所以你不能只继承它。

更新:(这里

WebScriptEnablingBehavior 是专为与 ASP.NET AJAX 客户端互操作而设计的 WebHttpBehavior 功能的“配置文件”。它添加了一些 AJAX-isms,例如自动生成 ASP.NET AJAX 客户端代理的能力。

我不确定您是否真的需要使用<enableWebScript/>,就像 Carlos 所说的那样,听起来只有在您使用 ASP.NET AJAX 时才需要它。

于 2011-05-31T21:47:53.207 回答