2011-01-25 12 views
22

Estoy probando un servicio REST en WCF en .net 4 - es decir, no hay archivo svc. Funciona muy bien cuando se ejecuta contra el servidor de desarrollo VS, pero cuando lo cambio para ejecutarlo contra IIS, obtengo 404s cuando intento navegar por la página de ayuda o acierto con cualquiera de los métodos de servicio.404 al ejecutar .net 4 Servicio WCF en IIS (no archivo svc)

He vuelto al servicio básico para ejecutarlo en IIS, pero no estoy seguro de lo que está mal.

El global.asax simplemente tiene

protected void Application_Start(object sender, EventArgs e) 
    { 
     RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(DataPortalService))); 
    } 

y el servicio en sí es tan simple como parece:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class DataPortalService : IDataPortalService 
{ 
    [WebGet(UriTemplate = "Test/TestMethod")] 
    public string TestMethod() 
    { 
     return "Hi!"; 
    } 
} 

[ServiceContract] 
public interface IDataPortalService 
{ 
    [OperationContract] 
    string TestMethod(); 
} 

y configuración de archivos de

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

    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
     <webHttpEndpoint> 
     <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" /> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    </system.serviceModel> 

</configuration> 

Golpear el/ayuda página o el método me da un 404.0.

Supongo que me falta algo de configuración en IIS para darle vida, aunque es un poco tonto que funcione bien en el servidor de desarrollo pero no en IIS.

+0

que versión de IIS? –

+0

7.5.7600 ejecutándose en W7. –

+0

¿Recibes un HTTP 404.4? Si es así, verifique que las asignaciones de su manejador sean correctas. – tomasmcguinness

Respuesta

27

Lo resolvió después de buscar en otros foros.

inicialmente añade lo siguiente a mi web.config:

<system.webServer> 
    <handlers> 
     <remove name="svc-Integrated-4.0" /> 
     <add name="svc-Integrated-4.0" path="*" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
</system.webServer> 

evidente por defecto de IIS no sabe qué hacer con las solicitudes sin extensión y los transmite al controlador de archivo estático.

Dado que MVC está utilizando la misma arquitectura de rutina, calculé que la plantilla básica del sitio MVC debe tener alguna configuración similar a la anterior ya que mis sitios MVC han funcionado bien cuando se movieron a IIS.

Resulta que tienen una configuración ligeramente diferente y tienen la siguiente entrada en su lugar:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

Ambas configuraciones parecen funcionar bien, pero que se establecieron en el uso de la segunda opción en este caso.

+2

* runAllManagedModulesForAllRequests = "true" * es necesario si no ha aplicado este hotfix http://support.microsoft.com/kb/980368. Obtenga más información al respecto aquí http://blogs.msdn.com/b/tmarq/archive/2010/04/01/asp-net-4-0-enables-routing-of-extensionless-urls-without-impacting-static -requests.aspx –

+0

Resuelvo este problema instalando la "Configuración recomendada de IIS 7" desde el Instalador de Web Platform. –

+0

Me he vuelto loco intentando que funcione y finalmente tu respuesta lo hizo. –

10

Tenía runAllManagedModulesForAllRequests="true" en mi web.config pero todavía no podía pasar el 404.0. También intenté instalar "Configuración recomendada de IIS 7" sin suerte. Al volver a ejecutar aspnet_regiis, me solucionó el problema.

  1. En el cuadro de diálogo Ejecutar, escriba cmd , y luego haga clic en OK.

  2. En el símbolo del sistema, use el comando cd para cambiar el directorio de la versión Aspnet_regiis.exe que desea utilizar. Por defecto, Aspnet_regiis.exe se encuentra en el siguiente directorio: sistema \ Microsoft.NET \ Framework \ versionNumber

  3. A continuación, ejecute el siguiente comando: aspnet_regiis -ir

Esto registrará "SVC -Integrado-4.0 "en las asignaciones de controladores.

+0

Esto solucionó mi problema. También puede ejecutar asp_regiis desde el Símbolo del sistema de Visual Studio (en Herramientas de Visual Studio en el menú Inicio). –

0

En IIS 5.1 en mi máquina, la página .svc solo se sirve cuando agregué el controlador de HTTP en el nivel del sitio web y en el nivel de la carpeta virtual. ¡Esto idealmente debería funcionar por herencia!

Extensión: .svc

ejecutable:

c: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll

0

HTTP pueden ser devueltos código 404 también si no tiene instalados algunos componentes de .NET framework.

Hay para la función de ejemplo Windows Communication Foundation HTTP Activation en .NET Framework 3.5 y en .NET Framework 4.6 hay HTTP Activation, Message Queuing (MSMQ) Activation y algunos más.

En Windows 10, estas características no están instaladas por defecto, así que tenga en cuenta para echar un vistazo a Windows Features.

Cuestiones relacionadas