2012-05-14 12 views
8

Estoy construyendo una pila de servicios por primera vez: hello world.Controlador de solicitud no encontrada:

he seguido la guía paso a paso en here:

pero me da un error: Manejador de Petición no encontrado: lo que podría ser la parte que falta? Gracias.

aquí está mi global.asax.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.SessionState; 
using ServiceStack.ServiceHost; 
using ServiceStack.WebHost.Endpoints; 

namespace ServiceStack.SearchService 
{ 
    public class Global : System.Web.HttpApplication 
    { 
     public class Hello { public string Name { get; set; } } 
     public class HelloResponse { public string Result { get; set; } } 
     public class HelloService : IService<Hello> 
     { 
      public object Execute(Hello request) 
      { 
       return new HelloResponse { Result = "Hello, " + request.Name }; 
      } 
     } 



     /// Web Service Singleton AppHost 
     public class HelloAppHost : AppHostBase 
     { 
      //Tell Service Stack the name of your application and where to find your web services 
      public HelloAppHost() 
       : base("Hello Web Services", typeof(HelloService).Assembly) { } 

      public override void Configure(Funq.Container container) { } 
     } 

     protected void Application_Start(object sender, EventArgs e) 
     { 
      //Initialize your application 
      var appHost = new HelloAppHost(); 
      appHost.Init(); 
     } 


     void Application_End(object sender, EventArgs e) 
     { 
      // Code that runs on application shutdown 

     } 

     void Application_Error(object sender, EventArgs e) 
     { 
      // Code that runs when an unhandled error occurs 

     } 

     void Session_Start(object sender, EventArgs e) 
     { 
      // Code that runs when a new session is started 

     } 

     void Session_End(object sender, EventArgs e) 
     { 
      // Code that runs when a session ends. 
      // Note: The Session_End event is raised only when the sessionstate mode 
      // is set to InProc in the Web.config file. If session mode is set to StateServer 
      // or SQLServer, the event is not raised. 

     } 

    } 
} 

aquí está mi web.config:

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=169433 
    --> 
<configuration> 
    <connectionStrings> 
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> 
    </authentication> 
    <membership> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager enabled="false"> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
     <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
     </providers> 
    </roleManager> 
    <httpHandlers> 
     <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" /> 
     <add path="api*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" /> 
    </httpHandlers> 
    </system.web> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <handlers> 
     <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" /> 
    </handlers> 
    </system.webServer> 
    <location path="servicestack"> 
    <system.web> 
     <httpHandlers> 
     <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" /> 
     <add path="servicestack*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*"/> 
     </httpHandlers> 
    </system.web> 
    <!-- Required for IIS 7.0 --> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <handlers> 
     <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" /> 
     </handlers> 
    </system.webServer> 
    </location> 
</configuration> 

hojeo tecleando en el navegador.

http://localhost:50097/ServiceStack.SearchService/servicestack/metadata 

Respuesta

7

Parece que usted está tratando de acoger ServiceStack tanto en la ruta raíz / y en una mezcla de /servicestack y /api rutas personalizadas. Usted tiene que escoger uno de ellos, no una combinación de los 3. Aquí está el config si desea alojar en el / root path:

<system.web> 
    <httpHandlers> 
    <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*"/> 
    </httpHandlers> 
</system.web> 

<!-- Required for IIS 7.0 --> 
<system.webServer> 
    <handlers> 
    <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" /> 
    </handlers> 
</system.webServer> 

Lo anterior se debe reemplazar cada dos mapeo ServiceStack config. Una vez hecho esto usted debe ser capaz de ver la página de metadatos en:

http://localhost:50097/metadata

Nota: Si se está utilizando ASP.NET en un puerto que es poco probable que usted también tiene la ruta del directorio virtual /ServiceStack.SearchService/.

+0

Estás haciendo un excelente trabajo con 'ServiceStack'. Acabo de probar el proyecto 'CustomAuthenticationMvc' desde aquí https://github.com/ServiceStack/ServiceStack.UseCases/tree/master/CustomAuthenticationMvc y está funcionando muy bien! :) Continúa con el trabajo INCREÍBLE ... Planeo llamar al servicio web desde una aplicación MonoTouch para iOS. –

+0

thx - me alegra que lo estés disfrutando :) – mythz

+0

Mi lectura del tutorial implicaba que si usabas nuget no necesitarías hacer las entradas web.config manualmente. Tenía que hacerlo. TAMBIÉN: Como se señaló en otra parte, si comenzaste con una aplicación MVC tienes que comentar la ruta predeterminada, eso es lo que finalmente me solucionó. – GeorgeBarker

11

Falta un pequeño paso en esa lista que necesita si va a asignar los servicios a una ruta personalizada. You can find it here:

citar el paso que falta:

You also need to configure the root path in your AppHost.

public override void Configure(Container container) 
{ 
    SetConfig(new EndpointHostConfig { ServiceStackHandlerFactoryPath = "api" }); 
} 

Dónde "api" es el nombre de la ruta personalizada que está utilizando.

+1

+1 Parece que esto falta en los documentos [aquí] (http://servicestack.net/ServiceStack.Hello/) @mythz – RedFilter

+0

Esto resolvió mi problema. – saille

2

Tuve este problema exacto que tuve y no pude encontrar una respuesta directa a - obteniendo un error 403.14 en la demostración más simple de ServiceStack.

.. :: .. :: respuesta simple

Su respuesta es simple. Ha confundido a sus manejadores al proporcionar 3 en lugar de uno como lo menciona Mythz. Además, no tiene una ruta específica para su solicitud.

[Route("/hello")] 
public class Hello { public string Name { get; set; } } 

Esto resolverá tanto su error 403.13 (cuestión semántica) y se puede ir a su http: // {localdomain}: {puerto}/hola y ver realmente los metadatos (sustituya el puerto {} con el número de puerto real IIS Express asignado a usted). Sin este ajuste, deberá ir a http: // {localdomain}: {port}/metadata.

.. :: Respuesta detallada :: ..

Enrutamiento, ya que se relaciona con IIS en ServiceStack se realiza por semántica/convención. Dado que estas rutas son dinámicas, cuando IIS no proporciona el enrutamiento adecuado en tiempo de ejecución, se supone que hay un problema de carpeta (ruta física) y arroja el error 403.14. Al mismo tiempo, si proporciona más de una ruta donde debería haber solo una, las cosas malas suceden en el tiempo de ejecución cuando todo está conectado.

Solo para asegurarse de tener todos los elementos esenciales, estos son todos los ajustes que debe realizar con el código original proporcionado.

a. Ajuste el archivo de configuración web para manejar una sola ruta como se exploró en la respuesta de Mythz

<system.web> 
    <httpHandlers> 
    <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*"/> 
    </httpHandlers> 
</system.web> 

<!-- Required for IIS 7.0 --> 
<system.webServer> 
    <handlers> 
    <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" /> 
    </handlers> 
</system.webServer> 

b. Realice el ajuste de ruta descrito anteriormente en esta publicación.

Cuestiones relacionadas