2010-07-29 13 views
11

He escrito un servicio que me gustaría exponer a través del reposo y el jabón. Todo lo que leo sobre WCF 4.0 dice que solo necesito exponer 2 puntos finales con diferentes comportamientos para hacer esto. Pero no puedo hacer que funcione.Hospedaje de puntos finales WC y jabón WCF uno al lado del otro

Aquí está mi contrato de servicios:

[ServiceContract] 
public interface MyService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate="data/{value}")] 
    string GetData(string value); 
} 

Aquí es mi web.config:

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 

     <services> 
      <service name="MyService"> 
       <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/> 
       <endpoint address="rest" behaviorConfiguration="restBehavior" binding="webHttpBinding" contract="MyService" /> 
       <endpoint address="soap" behaviorConfiguration="soapBehavior" binding="basicHttpBinding" contract="MyService" /> 
      </service> 
     </services> 

     <behaviors> 

      <serviceBehaviors> 
       <behavior> 
        <serviceMetadata httpGetEnabled="true"/> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
       </behavior> 
      </serviceBehaviors> 

      <endpointBehaviors> 
       <behavior name="restBehavior"> 
        <webHttp automaticFormatSelectionEnabled="true" helpEnabled="true" /> 
       </behavior> 
       <behavior name="soapBehavior" /> 
      </endpointBehaviors> 

     </behaviors> 

     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 

    </system.serviceModel> 

    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 

</configuration> 

estoy usando enrutamiento para definir la URL de mi servicio:

public class Global : System.Web.HttpApplication 
    { 
     protected void Application_Start(object sender, EventArgs e) 
     { 
      RouteTable.Routes.Add(new ServiceRoute("dns", new ServiceHostFactory(), typeof(MyService))); 
     } 
    } 

¿Hay algo que estoy haciendo mal aquí? Realmente podría usar algo de ayuda.

+0

también encontré este otro [pregunta/respuesta] (http://stackoverflow.com/questions/186631/rest-soap-endpoints-for-a-wcf -servicio) útil. – SMB

Respuesta

4

Nunca encontré la forma "correcta" de hacer esto en la configuración, pero pude usar el motor de enrutamiento para lograr esto.

Mi archivo GLOBAL.ASAX ahora se ve así:

public class Global : System.Web.HttpApplication 
    { 
     protected void Application_Start(object sender, EventArgs e) 
     { 
      RouteTable.Routes.Add(new ServiceRoute("my/soap", new ServiceHostFactory(), typeof(MyService))); 
      RouteTable.Routes.Add(new ServiceRoute("my/rest", new WebServiceHostFactory(), typeof(MyService))); 
     } 
    } 

y mi config como esto: (para permitir que el resto de páginas de ayuda)

<system.serviceModel> 

    <standardEndpoints> 
     <webHttpEndpoint> 
      <standardEndpoint automaticFormatSelectionEnabled="true" helpEnabled="true"/> 
     </webHttpEndpoint> 
    </standardEndpoints> 

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 

</system.serviceModel> 

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

Me gusta que esto esté en línea con el modelo asp.net MVC más y requiere poca configuración. Además, hacerlo de esta manera me permitió eliminar por completo los archivos .svc de mi proyecto, que también es un plus de IMO.

1

¿Cómo hospedas tu servicio WCF? En IIS, necesita un directorio virtual y un archivo MyService.svc en algún lugar para habilitar la activación del servicio.

Si se quita la ServiceRoute por ahora (para simplificar las cosas), usted debería ser capaz de llegar a su punto final servicio SOAP en:

http://YourServer:Port/YourVirtualDirectory/YourService.svc/soap 

y su servicio de descanso debe ser de al

http://YourServer:Port/YourVirtualDirectory/YourService.svc/rest/data/{value} 

(donde proporciona un valor arbitrario para {value}).

¿Qué es exactamente lo que no funciona en su caso?

Puede probar y probar los puntos finales SOAP mediante el WCF Test Client, mientras que debería poder presionar la URL REST en cualquier navegador.

+1

Estoy alojando en IIS. El problema que veo si que el punto final de jabón sólo se puede acceder si se ha configurado en la dirección URL raíz: De cualquier http: // YourServer: Puerto/YourVirtualDirectory/YourService.svc o http: // YourServer: Port/YourVirtualDirectory/YourService (dependiendo de si utilizo la ruta del servicio). Pero si lo configuro de esa manera, por algún motivo no se puede acceder al resto de los puntos finales. Alternativamente, si configuro como se describió originalmente, solo se puede acceder a los puntos finales restantes y el punto final soap me devuelve un error de 400. – Troy

+0

Intenté agregar un archivo de servicio completamente nuevo (.svc) a mi proyecto. Usando la misma configuración que la anterior, funcionó ... tanto el servicio de reposo como el de jabonería funcionaban bien desde la url .svc, pero solo se podía acceder al servicio de soap desde la raíz. La dirección/soap configurada no se respetó. – Troy

1

Esto se puede hacer en la configuración. De MSDN hilo del foro por el usuario Ladislav Mrnka: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4e95575f-1097-4190-80dd-7a0f96d73f6e

<system.serviceModel> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="REST"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="iSell.Prospects.ProspectBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="iSell.Prospects.ProspectBehavior" name="iSell.Prospects.ProspectService"> 
    <endpoint address="" behaviorConfiguration="REST" binding="webHttpBinding" contract="iSell.Prospects.ProspectService" /> 
    <endpoint address="soap" binding="basicHttpBinding" contract="iSell.Prospects.ProspectService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
</system.serviceModel> 
+1

Sugerencia para cualquiera que intente hacer que esto funcione. Su URI de jabón se verá así: 'http: // host/myService.svc/soap /' – dummy

Cuestiones relacionadas