namespace endpointaddress wcf iis configuration-files wcf-behaviour

wcf - endpointaddress - El comportamiento personalizado no se registrará en mi web.config



wcf http binding configuration (2)

La pieza que falta es la clase BehaviorExtensionElement. En el OP intentaba agregar el derivado WebHttpBehavior como un elemento. El BehaviorExtensionElement le dice al config-parser qué tipo usar para un elemento determinado.

Aquí está la implementación que necesitaba:

public class NewtonsoftJsonBehaviorExtension : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(NewtonsoftJsonBehavior); } } protected override object CreateBehavior() { return new NewtonsoftJsonBehavior(); } }

Esto no fue suficiente para deshacerme de mi WebServiceHostFactory personalizado, por supuesto. También tuve que agregar un ContentTypeMapper personalizado:

public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper { public override WebContentFormat GetMessageFormatForContentType(string contentType) { return WebContentFormat.Raw; } }

Entonces podría usarlos en mi Web.config. Aquí están las partes relevantes de la configuración de trabajo. Primero configurando la extensión y configurando un comportamiento con ella:

<extensions> <behaviorExtensions> <add name="newtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehaviorExtension, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions> <behaviors> <endpointBehaviors> <behavior name="jsonRestEndpointBehavior"> <webHttp/> <newtonsoftJsonBehavior/> </behavior> </endpointBehaviors> <behaviors>

Luego configurando un enlace webHttp con mi contentTypeMapper personalizado:

<bindings> <webHttpBinding> <binding name="newtonsoftJsonBinding" contentTypeMapper="Newtonsoft.Json.Extensions.NewtonsoftJsonContentTypeMapper, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </webHttpBinding> </bindings>

Finalmente configurando un punto final utilizando lo anterior:

<services> <service name="My.Namespaced.MyService" behaviorConfiguration="jsonRestServiceBehavior"> <endpoint address="" behaviorConfiguration="jsonRestEndpointBehavior" binding="webHttpBinding" bindingConfiguration="newtonsoftJsonBinding" contract="My.Namespaced.IMyService" /> </service> </services>

Espero que esto ayude a alguien por ahí. :)

Tengo una aplicación que funciona utilizando Json.NET (newtonsoft) como un serializador personalizado. Actualmente estoy agregando este derivado de WebHttpBehavior en un WebServiceHostFactory personalizado. Vea el fragmento de código al final de este blog para saber cómo lo he adjuntado.

Como hospedo este servicio en IIS, me gustaría deshacerme de mi código de hospedaje personalizado y simplemente agregar el comportamiento personalizado a mi web.config. El procedimiento se muestra en este artículo msdn .

Así que trato de hacerlo así:

<behaviors> <endpointBehaviors> <behavior name="jsonRest"> <webHttp defaultOutgoingResponseFormat="Json" /> <NewtonsoftJsonBehavior/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <extensions> <behaviorExtensions> <add name="NewtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehavior, NewtonsoftJsonExtensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions>

Lamentablemente, no puedo hacer que funcione. Cuando hago eso, Visual Studio me dice que

El elemento ''comportamiento'' tiene un elemento secundario no válido ''NewtonsoftJsonBehavior''

En el anterior artículo MSDN , se dice que

Para agregar habilidades de configuración al elemento, debe escribir y registrar un elemento de configuración. Para obtener más información sobre esto, consulte la documentación de System.Configuration .

Después de definir el elemento y su tipo de configuración, se puede usar la extensión, como se muestra en el siguiente ejemplo.

Tengo la sensación de que lo que me falta es exactamente eso. De alguna manera el registro del elemento y su tipo de configuración. Lamentablemente no puedo hacer caras o colas del System.Configuration que se supone que me diga cómo hacerlo. Así que esa es básicamente mi pregunta:

¿Cómo escribo y registro el elemento de configuración, y si ese no es mi problema, cuál es el problema?

¡Muchas gracias de antemano!


Si abre esta aplicación .config con svcconfigeditor, debería comenzar a pedir que se seleccione el ensamblaje asociado con NewtonsoftJsonBehavior. Si selecciona eso y vuelve a guardar el archivo app.config, ¿eso resuelve su problema?

Por cierto, también utilizamos una extensión de enlace personalizada en nuestras configuraciones de servicio. El xml en la configuración siempre subraya la extensión con una onda azul que indica que el elemento no se conoce en el esquema como lo describe. Sin embargo, cuando iniciamos el servicio, tanto el servicio como el comportamiento funcionan como se espera.