2009-05-18 7 views
6

Tengo un servicio de WCF:La unión no funciona en "modo dual" (webHttpBinding y basicHttpBinding)

<%@ ServiceHost Language="C#" Debug="true" Service="IWW.MIGTurbo2.WCF.Security.SecurityBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %> 

Esto funciona muy bien usar webHttpBinding de mi proyecto web.

También quiero que este servicio pueda ser utilizado por un cliente WinForms, por lo que he agregado un enlace basicHttpBinding.

Mi archivo de configuración del servidor es actualmente:

<system.serviceModel> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
<behaviors> 
    <endpointBehaviors> 
     <behavior name="webScriptEnablingBehavior"> 
      <enableWebScript /> 
     </behavior> 
     <behavior name="webHttpEnablingBehaviour"> 
      <webHttp /> 
     </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
     <behavior name="webHttpEnablingBehaviour"> 
      <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
     <behavior name="webScriptEnablingBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service name="IWW.MIGTurbo2.WCF.Security.SecurityBroker" behaviorConfiguration="webHttpEnablingBehaviour"> 
     <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
     <!-- This works for web-clients --> 
        <endpoint address="" 
      binding="webHttpBinding" 
      bindingConfiguration="default" 
      contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker" 
       behaviorConfiguration="webHttpEnablingBehaviour"> 
     </endpoint> 
     <!-- This is for WinForms clients, but isn't working --> 
       <endpoint address="" 
      binding="basicHttpBinding" 
      bindingConfiguration="default" 
      contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker" 
       behaviorConfiguration="webHttpEnablingBehaviour"> 
     </endpoint> 
    </service> 
</services> 
<client /> 
<bindings> 
    <webHttpBinding> 
     <binding name="default" ></binding> 
    </webHttpBinding> 
    <basicHttpBinding> 
     <binding name="default" allowCookies="true"></binding> 
    </basicHttpBinding> 
</bindings> 

La sección marcada para WinForms no parece funcionar. Obtengo una excepción:

The endpoint at ' http://localhost:56125/MIGTurbo2_WEB/api/wcf/SecurityBroker.svc ' does not have a Binding with the None MessageVersion. 'System.ServiceModel.Description.WebHttpBehavior' is only intended for use with WebHttpBinding or similar bindings.

Cuando intento buscar manualmente el archivo .svc con IE. Obviamente, el cliente de WinForms no quiere saber.

¿Alguien puede difundir alguna luz sobre por qué no está funcionando? Casi parece que no puedo tener más de un punto final o el segundo punto final no está configurado correctamente? Google no ofrece nada que sea particularmente útil.

+0

¿Cómo se aloja el servicio? Noté que ninguno de los puntos extremos tiene una dirección configurada y no hay una dirección base definida en la muestra que proporcionó. Además, ¿por qué su aplicación winforms no pudo usar la webHttpBinding? –

+0

El servicio se aloja en una carpeta "api" del proyecto del sitio web. Esto está actualmente detrás de ASP.NET Dev Server, aunque finalmente estará detrás de IIS. No he especificado ninguna dirección porque no quiero vincularme a ningún servidor fijo en este momento. El proyecto debe poder implementarse en varias URL y, si es posible, no desea atarlo. (Estoy usando el código para generar la URL) –

+0

He eliminado basicHttpBinding, y ahora estoy usando el webHttpBinding, pero ahora aparece un error: "{" No había ningún punto extremo escuchando en http: // localhost: 56125/MIGTurbo2_WEB/api/wcf/SecurityBroker.svc que podría aceptar el mensaje. Esto a menudo es causado por una dirección incorrecta o acción SOAP. Consulte InnerException, si está presente, para obtener más detalles. "}" Que solo contiene una InnerException que contiene un 404. Veo la dirección en IE y obtengo la página de servicio amigable en IE. –

Respuesta

6

Como dice la excepción, su segundo punto final tiene (1) webHttpBehavior y (2) basicHttpBinding, y estos son incompatibles. Creo que es posible que desee eliminar la webHttpBehavior del segundo punto final.

+0

Gracias.

He eliminado el behaviourConfiguration del segundo punto final y ahora obtengo una excepción: "Ya se ha asociado una instancia de enlace para escuchar el URI 'http: // localhost: 56125/MIGTurbo2_WEB/api/wcf/SecurityBroker.svc'. dos puntos finales quieren compartir el mismo ListenUri, también deben compartir la misma instancia de objeto vinculante. Los dos extremos conflictivos se especificaron en AddServiceEndpoint() llamadas, en un archivo de configuración o una combinación de AddServiceEndpoint() y config. "

Básicamente, estoy tratando de obtener mi servicio para atender a 2 clientes y ¡no tener mucha suerte! –

+0

cambie la dirección del segundo punto final (por ejemplo, y luego haga que el cliente pulse blahAddress/other – Brian

+0

Gracias por su ayuda Me di cuenta de que Visual Studio había creado un que era incorrecto. Debería haber tenido un enlace de . Aceptaré su respuesta y escribiré una respuesta adecuada. ¡Este formato de comentario no es útil para eso! –

5

La respuesta:

(Brian consiguió los puntos, pero esto es lo que causó más detalles)

Visual Studio ha creado un elemento de "customBinding" para mí en el lado del cliente, el cual fue menos que útil. Así que para que funcione, he cambiado de app.config del lado del cliente para ser:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="WebHttpBinding_ISecurityBroker" allowCookies="true" /> 
     </basicHttpBinding>  
    </bindings> 
    <client>   
     <endpoint binding="basicHttpBinding" bindingConfiguration="WebHttpBinding_ISecurityBroker" 
      contract="Client.API.WCF.ISecurityBroker" name="WebHttpBinding_ISecurityBroker" /> 
    </client> 
</system.serviceModel> 

y mi web.config en el servidor a ser:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <behaviors> 
     <endpointBehaviors> 

      <behavior name="webHttpEnablingBehaviour"> 

       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 

      <behavior name="webHttpEnablingBehaviour"> 
       <serviceMetadata httpGetEnabled="true" /> 
      </behavior> 

     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service 
      name="IWW.MIGTurbo2.WCF.Security.SecurityBroker" behaviorConfiguration="webHttpEnablingBehaviour"> 
      <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 

      <endpoint address="" 
       binding="webHttpBinding" 
       bindingConfiguration="default" 
       contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker" 
       behaviorConfiguration="webHttpEnablingBehaviour"> 
      </endpoint> 
      <endpoint address="other" 
       binding="basicHttpBinding" 
       bindingConfiguration="default" 
       contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"> 
      </endpoint> 
     </service> 

    </services> 
    <client /> 
    <bindings> 
     <webHttpBinding> 
      <binding name="default" ></binding> 
     </webHttpBinding> 
     <basicHttpBinding> 
      <binding name="default" allowCookies="true"></binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

y tengo el siguiente código a conectan dentro de mi aplicación cliente (Windows Forms):

using (SecurityBrokerClient securityBrokerClient = new SecurityBrokerClient()) 
     { 
      string securityBrokerUrl=url+"api/wcf/SecurityBroker.svc"; 
      securityBrokerUrl += "/other"; 
      securityBrokerClient.Endpoint.Address = new System.ServiceModel.EndpointAddress(securityBrokerUrl); 
      securityBrokerClient.Open(); 
      securityBrokerClient.Login(username, password, "MIGTurbo2Admin"); 
     } 
2

La primera y principal problema que veo en su archivo de configuración es la configuración de puntos finales.

<endpoint address="" binding="webHttpBinding" bindingConfiguration="default" 
      contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker" 
      behaviorConfiguration="webHttpEnablingBehaviour"> 
</endpoint> 

      <!-- This is for WinForms clients, but isn't working --> 

<endpoint address="" binding="basicHttpBinding" bindingConfiguration="default" 
      contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker" 
      behaviorConfiguration="webHttpEnablingBehaviour"> 
</endpoint> 

Aquí no estamos especificando ninguna dirección y listenuri en la etiqueta. Entonces tendremos valores por defecto para estos y también para los 2 puntos finales tendremos la misma dirección y el mismo listenuri (es decir, valores por defecto).

Así que aquí viene el problema. 1. no podemos tener diferentes tipos de enlace con el mismo listenuri y la misma dirección. Pero en su caso, al especificar valores vacíos para la dirección, ambos puntos finales tendrán los mismos valores

Resolución: 1. especifique una dirección diferente para ambos extremos en lugar de dejarlos como vacíos.

<endpoint address="Rest" binding="webHttpBinding" bindingConfiguration="default" 
      contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker" 
      behaviorConfiguration="webHttpEnablingBehaviour"> 
</endpoint> 

      <!-- This is for WinForms clients, but isn't working --> 

<endpoint address="WebForm" binding="basicHttpBinding" bindingConfiguration="default" 
      contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker" 
      behaviorConfiguration="webHttpEnablingBehaviour"> 
</endpoint> 

Así que a pesar de que estamos utilizando diferentes fijaciones y listenuri mismo (si no se especifica listenuri será por defecto) como la dirección de los valores (dirección relativa) difieren va a trabajar bien.

Cuestiones relacionadas