2011-01-05 11 views
8

Estoy tratando de tener SOAP y RESTful en el mismo servicio WCF. También lo he visto aparte de un problema. Lo que sigue es mi web.config:SOAP, JSON y POX en el mismo restful wcf

<service behaviorConfiguration="webBehaviour" name="MyServices"> 
     <clear /> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" 
     name="basicHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="ws" binding="wsHttpBinding" bindingConfiguration="WsHttp" 
      name="wsHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="web" binding="webHttpBinding" bindingConfiguration="WebHttp" behaviorConfiguration="webBehavior" 
      name="webHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="json" binding="webHttpBinding" bindingConfiguration="WebHttp" behaviorConfiguration="webJSONBehavior" 
      name="webJSONHttpBinding" contract="DJSharedServices.ISharedServices" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" name="mexBinding" />   
     </service>  
    </services> 

Cuando tengo todos los puntos finales que da el siguiente error:

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: 
System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.ServiceModel.Description.WsdlExporter.CreateWsdlBindingAndPort(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName, Port& wsdlPort, Boolean& newBinding, Boolean& bindingNameWasUniquified) 
    at System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName) 
    at System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName) 
    at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata() 
    at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.Get(Message message) 
    at SyncInvokeGet(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

cosas funcionan bien si comento hacia fuera punto final JSON.

¿Puedes ayudarme a descubrir por qué?

Gracias de antemano.

Respuesta

12

Bueno, acabo de agregar cambiado la configuración de enlace para el comportamiento json. Estaba usando la misma configuración de binging para JSON y POX. Ahora he cambiado la configuración de:

<service behaviorConfiguration="WebBehaviour" name="MyServices"> 
     <clear /> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" 
     name="basicHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="ws" binding="wsHttpBinding" bindingConfiguration="WsHttp" 
      name="wsHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="web" binding="webHttpBinding" bindingConfiguration="WebHttp" behaviorConfiguration="webBehavior" 
      name="webHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="json" binding="webHttpBinding" bindingConfiguration="WebjsonHttp" behaviorConfiguration="webJSONBehavior" 
      name="webJSONHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" name="mexBinding" />   
     </service> 

y configuración de enlace añadido:

<webHttpBinding> 
     <binding name="WebHttp" > 
      <security mode="None"></security> 
     </binding> 

     <binding name="WebjsonHttp" > 
      <security mode="None"></security> 
     </binding> 
     </webHttpBinding> 
+0

¿Alguna idea de por qué los dos extremos no pueden compartir un enlace para que el wsdl funcione? – JeremyWeir

+0

@Jayrdub Creo que porque necesita una dirección diferente, y una dirección diferente necesita diferentes proxies. – genericuser

+0

sí, y no hay una funcionalidad lista para usar con WCF como la que hay con la WebAPI, donde le permitirá mantener sus URL más limpias al sacar la dirección = "json", address = "xml" yada yada. WebApi examina su tipo de contenido y se da cuenta por sí solo, lo cual es un buen ahorro de tiempo en el código de sus servicios y configuraciones. – PositiveGuy

2

Hágase un favor y dejar de tratar de crear un servicio que hace las dos SOAP y REST. Vas a terminar con un desastre. Revise sus requisitos y elija el enfoque que mejor se adapte a sus necesidades.

+1

¿por qué dices eso? ¿Tiene algunos enlaces que dicen que este enfoque no es adecuado, o que cualquier otro enfoque es mejor? – genericuser

+0

@ Priya10 SOAP es un protocolo que admite la implementación de una arquitectura de objetos remotos. REST es un estilo arquitectónico completamente diferente. O bien es un enfoque válido, para el escenario correcto, pero los dos no son compatibles. –

+2

@DarrelMiller: eso no va a funcionar cuando un cliente quiere un REST y el otro quiere que las interfaces SOAP funcionen básicamente con la misma funcionalidad – DeepSpace101

Cuestiones relacionadas