Обработчик запроса не найден:

Я впервые создаю стек сервисов: привет, мир.

Я выполнил пошаговое руководство в здесь:

но это дает мне ошибку: обработчик запроса не найден: что может быть недостающей частью? Благодарю.

вот мой 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.

        }

    }
}

вот мой 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>

Я просматриваю его, набрав в браузере.

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

person user742102    schedule 14.05.2012    source источник


Ответы (3)


Похоже, вы пытаетесь разместить ServiceStack как по корневому пути /, так и по сочетанию настраиваемых путей /servicestack и /api. Вам нужно выбрать один из них, а не комбинацию всех 3. Вот конфигурация, если вы хотите разместить на / корневой путь:

<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>

Вышеупомянутое должно заменить любое другое сопоставление конфигурации ServiceStack. После того, как вы это сделаете, вы сможете просмотреть страницу метаданных по адресу:

http://localhost:50097/metadata

Примечание. Если вы используете ASP.NET на порту, маловероятно, что у вас также есть путь к виртуальному каталогу /ServiceStack.SearchService/.

person mythz    schedule 14.05.2012
comment
Вы отлично справляетесь с ServiceStack. Только что попробовал проект CustomAuthenticationMvc отсюда github.com/ServiceStack/ServiceStack.UseCases/tree /master/ и он отлично работает! :) Продолжайте в том же духе... Я планирую вызвать веб-сервис из приложения MonoTouch для iOS. - person Leniel Maccaferri; 26.11.2012
comment
Мое прочтение учебника подразумевало, что если вы используете nuget, вам не нужно будет вручную создавать записи web.config. Мне пришлось. ТАКЖЕ: как указано в другом месте, если вы начали с приложения MVC, вам нужно закомментировать маршрут по умолчанию - вот что, наконец, исправило его для меня. - person GeorgeBarker; 28.06.2013


У меня была именно эта проблема, и я не мог найти прямого ответа на нее — получить ошибку 403.14 в самой простой демонстрации ServiceStack.

..:: Простой ответ ::..

Ваш ответ прост. Вы запутали своих обработчиков, предоставив 3 вместо одного, как указано Mythz. Кроме того, у вас нет указанного маршрута для вашего запроса.

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

Это устранит как вашу ошибку 403.13 (семантическая проблема), так и вы сможете перейти на свой http://{localdomain}:{port}/hello и просмотреть метаданные (замените {port} фактическим номером порта, назначенным IIS Express для ты). Без этой настройки вам нужно будет перейти по адресу http://{localdomain}:{port}/metadata.

..:: Подробный ответ ::..

Маршрутизация, поскольку она относится к IIS в ServiceStack, выполняется семантикой/соглашением. Поскольку эти маршруты являются динамическими, когда IIS не обеспечивает правильную маршрутизацию во время выполнения, предполагается, что существует проблема с папкой (физический путь), и выдается ошибка 403.14. В то же время, если вы предоставляете более одного пути, а должен быть только один, во время выполнения, когда все подключено, случаются плохие вещи.

Просто чтобы убедиться, что у вас есть все необходимое, вот все изменения, которые вам нужно внести в исходный код.

а. Настройте файл веб-конфигурации, чтобы он обрабатывал только один путь, как описано в ответе 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>

б. Сделайте корректировку маршрута, описанную ранее в этом посте.

person Rick    schedule 17.01.2014