【问题标题】:How to ignore a route with self-hosted ServiceStack如何使用自托管 ServiceStack 忽略路由
【发布时间】:2012-11-07 11:53:24
【问题描述】:

我目前正在研究一种解决方案,我们正在运行一个自托管的 ServiceStack 层,但问题是当我从浏览器访问它并且浏览器尝试获取 favicon 时,我不断收到错误消息。据我所知,在运行自托管时没有忽略特定路由的选项?

我会想到类似的东西

Routes.Ignore("favicon*")

有点像

Routes.Add<Foo>("/foo")

在我的 AppHost 配置方法中

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    在我的 web.config 中,我喜欢这样的东西

    <handlers>
        <add verb="*" path="*.*" type="System.Web.StaticFileHandler" name="files" />
        <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true"/>
    </handlers>
    

    这样,所有带有扩展名的文件都由 IIS 处理,这意味着您不必一直通过 aspnet 管道来服务器上一个 404。这也意味着您不会在您的文件中记录 404 的负载服务栈应用程序。

    【讨论】:

    • 伙计,这是一个很好的解决方案……如果有任何副作用,会在这里报告,但到目前为止看起来很完美。
    【解决方案2】:

    与使用 Http 模块 处理和劫持所有请求的 MVC 不同,ServiceStack 构建在 ASP.NET 的原始 IHttpHandler 接口之上。这意味着 ServiceStack 必须通过返回 IHttpHandler 来处理与 ServiceStack 处理程序路径(例如 //api)匹配的任何请求,并且不能像在 MVC 中那样忽略它们。

    但是,您可以通过在IAppHost.CatchAllHandlers 中注册处理程序来捕获并处理所有未处理的请求,例如:

    appHost.CatchAllHandlers.Add((httpMethod, pathInfo, filePath) => {
       if (pathInfo.StartsWith("favicon"))
          return new NotFoundHttpHandler();
    });
    

    【讨论】:

    • 顺便说一句,它应该默认返回什么,因为实现需要它:) 某种 ServiceStackHandler?
    • 返回任何 ASP.NET IHttpHandler 都可以,这将使您保留对请求的完全控制。如果您还希望它支持自主机,也让您的处理程序实现IServiceStackHttpHandler
    • @cyberzed 默认返回为空
    • 当前版本 3.9.37 的行为没有变化。仍然会记录错误ERROR: [::1]:1337 Request not found: /favicon.ico
    【解决方案3】:

    只是附加到@antonydenyer 的答案。将 owin 与 servicestack3 结合使用时,他的解决方案似乎也有效。

    <handlers> <add path="auth/*" name="Microsoft.Owin.Host.SystemWeb" type="Microsoft.Owin.Host.SystemWeb.OwinHttpHandler, Microsoft.Owin.Host.SystemWeb" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" /> <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" /> </handlers>

    这里 SS 处理除 /auth 之外的所有请求。 Auth 使用 owin 映射到 Identityserver3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-07
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多