2011-07-10 22 views
6

tengo WCF alojado servicio SOAP, que soy capaz de golpear desde el navegador, así como de mi cliente SOAP bien al hacer peticiones HTTP GET, sin embargo, al hacer cualquier Solicitudes HTTP POST, la respuesta es un 404 No encontrado..NET 4 WCF Servicio de SOAP HTTP POST devuelve el error 404 que no se encuentran

Mi Web.config se parece a:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior> 
       <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
       <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    <bindings> 
     <wsHttpBinding> 
      <binding> 
       <security mode="Transport"> 
        <transport clientCredentialType="Certificate" /> 
       </security> 
       <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binding> 
     </wsHttpBinding> 
     <basicHttpBinding> 
      <binding> 
       <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

Mi servicio se define en el marcado mediante el archivo .svc como:

<%@ ServiceHost Language="C#" Debug="true" Service="Boca.WebServices.Billing.QBService" CodeBehind="QBService.svc.cs" %> 

Una vez más, puedo golpear a mi servicio utilizando el navegador y un cliente SOAP como sigue utilizando un HTTP GET, pero no con HTTP POST:

¿Qué estoy haciendo mal? ¿No debería usar el marcado .svc y simplemente definir mi servicio en Web.config?

ACTUALIZACIÓN:

Cuando mi proyecto WCF "depuración empezar" desde dentro de VS 2010 mediante IIS Express en un localhost: 8181 puerto, los envíos HTTP a los trabajos de mantenimiento. Solo cuando el servicio se aloja a través de IIS, el HTTP POST del servicio se rechaza o no se encuentra.

Respuesta

7

He resuelto el problema. Después de todo, no era un problema de IIS sino un problema con el yo que no configuraba el <basicHttpBinding> con el nodo <security>. Me di no leído a fondo sobre fijaciones y cómo funcionan, así que pensé que la adición de la <wsHttpBinding> junto al <basicHttpBinding> añadiría soporte SSL para WCF.

Si lo hace, y la configuración por defecto <wsHttpBinding> con el nodo <security> definitivamente me permitió obtener los metadatos de SOAP de forma segura a pesar de que el interior todavía estaba usando el <basicHttpBinding>, sin embargo puestos no fueron apoyados.

He actualizado mi configuración para que el transport clientCredentialType se estableció en None y que resuelva el problema:

<bindings> 
    <basicHttpBinding> 
     <binding name="QBService_BasicHttpBinding"> 
      <security mode="Transport"> 
       <transport clientCredentialType="None" /> 
      </security> 
      <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
    </basicHttpBinding> 
</bindings> 
2

Suponiendo que está utilizando .NET 4 su servicio estará escuchando en uno o más puntos finales usando basicHttpBinding - este es el valor predeterminado si no se especifica un punto final cuando se utiliza HTTP

Si sólo tiene un contrato de servicios entonces su servicio escuchará HTTP POST en la dirección que termina con .svc. Si tiene más de un contrato de servicio, entonces aloja cada contrato en una dirección como <path to .svc>/<serviceContractname>

El servicio espera una solicitud SOAP, por lo que tendrá que ENVIAR un documento XML que coincida con SOAP 1.1 (valores predeterminados de HTTP_BlackBinding a esto). La forma más fácil de lograr esto es construir un proxy usando Add Service Reference en un proyecto de cliente y hacer llamadas a través de la clase proxy generada - WCF Plumbing generará el mensaje apropiado y lo enviará al servicio

+0

La cuestión es que hacer un HTTP POST resultados en un 404 mientras que haciendo un HTTP GET funciona. Además, me he dado cuenta de que si depuro mi VS 2010 WCF Project utilizando IIS Express desde VS 2010, los HTTP POSTS para el servicio funcionan bien.Parece que solo cuando estoy alojado a través de IIS veo este comportamiento. –

+0

Creo que sería más útil verlo como "recuperar los metadatos funciona pero hacer una solicitud de servicio falla con un 404". Supongo que está haciendo los GET utilizando Add Service Reference o un navegador y los POST que utilizan una solicitud pensaban que el proxy generado es correcto. –

+0

Además, ¿cuántos contratos de servicio implementa su servicio? –

Cuestiones relacionadas