【问题标题】:WCF - how to set "enableWebScript" dynamically?WCF - 如何动态设置“enableWebScript”?
【发布时间】: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


【解决方案1】:

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

    public  WebHttpBehaviorEx()
    {
        DefaultBodyStyle = WebMessageBodyStyle.Wrapped;
        DefaultOutgoingRequestFormat = WebMessageFormat.Json;
        DefaultOutgoingResponseFormat = WebMessageFormat.Json;
    }

【讨论】:

  • 那么在添加此代码后,您的 enableWebScript 没有被覆盖?
【解决方案2】:

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

更新: (from here)

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

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

【讨论】:

  • 实际上,当我中断 CreateServiceHost() 方法时,我检查了端点行为,它确实有一个 WebScripEnablingBehavior 对象作为行为之一。我或许可以为其设置或启用此属性,但我不知道也找不到如何访问其上的 enableWebScript 属性。
  • 我认为我需要它的唯一原因是因为在我以编程方式添加我的行为并使用配置设置之前,我曾经从返回的结果对象中的“.d”参数中获取我的数据Ajax 调用。现在我直接从结果对象中获取数据。阅读更多内容后,我发现 enableWebScript 出于安全目的添加了“.d”参数(跨站点脚本风险)here。所以我确实得到了我的数据,但我错过了 .d 参数的附加安全性,这让我想知道我是否必须以编程方式设置它。
  • @Ben 老实说,除非我误解了某些东西,否则我发现在d 中返回数据更安全的论点是相当弱的。当然,它不能使用默认的 AJAX 库作为 JSON 结构进行解析,但它如何阻止某人使用自定义解析(就像我确定你必须这样做一样)?为了使跨站点脚本起作用,攻击者必须知道您的脚本服务才能发出请求,假设他们能够滚动自己的对象解析器是否合理?
  • 乔尔,感谢您的回复。无论如何,我都不是这方面的专家,但我认为“d”只会使结果成为无效的 JavaScript 命令。这是另一个site that explains it。但除此之外,我真的想弄清楚如何动态设置这些值。我遇到的另一个问题是动态设置行为以使用 Windows 凭据。请参阅我对原始帖子的补充。
  • @Ben,你找到解决办法了吗?
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2020-08-30
相关资源
最近更新 更多