WCF - как установить «enableWebScript» динамически? - PullRequest
1 голос
/ 31 мая 2011

Я работаю над своим первым сервисом 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» для своего динамически создаваемого поведения? Или это невозможно?

Обновление (01.06.2011)Я также хочу динамически изменить поведение для использования учетных данных Windows для проверки подлинности. В файле конфигурации это делается так:

<bindings>
  <webHttpBinding>
    <binding name="Binding1">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </webHttpBinding>
</bindings>

Это не такее настройки мне нужно сделать программно, так как кажется, что игнорируются настройки конфига.

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Для меня это сработало после добавления следующего конструктора в WebHttpBehaviorEx

    public  WebHttpBehaviorEx()
    {
        DefaultBodyStyle = WebMessageBodyStyle.Wrapped;
        DefaultOutgoingRequestFormat = WebMessageFormat.Json;
        DefaultOutgoingResponseFormat = WebMessageFormat.Json;
    }
0 голосов
/ 01 июня 2011

Существует класс WebScriptEnablingBehavior, который вы сможете создать программно и добавить в коллекцию Behaviors вашей конечной точки. Я никогда не пробовал, и не знаю, как именно это будет работать, если несколько вариантов поведения будут определены на одной конечной точке, но я думаю, что это в основном то, что вы делаете в своей декларативной конфигурации. К сожалению, WebScriptEnablingBehavior (который наследуется от WebHttpBehavior) запечатан, поэтому вы не можете просто наследовать от него.

Обновление: ( отсюда )

WebScriptEnablingBehavior - это «профиль» функциональности WebHttpBehavior, разработанный специально для взаимодействия с клиентами ASP.NET AJAX. Он добавляет некоторые AJAX-измы, такие как возможность автоматической генерации клиентских прокси-серверов ASP.NET AJAX.

Я не уверен, что вам действительно нужно использовать <enableWebScript/>, как сказал Карлос, похоже, что это нужно только при использовании ASP.NET AJAX.

...