OWIN 使用 SignalR 并防止 'HTTP Error 403.14 - Forbidden'
OWIN use SignalR and prevent 'HTTP Error 403.14 - Forbidden'
我在 OWIN 自托管应用程序中托管 SignalR - 在 Azure 中,如下所示:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
...
很简单,工作正常。按预期公开 /signalr/hubs
。
我想做的是在有人点击 /
url 时阻止 HTTP 403.14。请求 /
returns HTTP 403.14:
HTTP Error 403.14 - Forbidden
我认为最好通过返回空响应来隐藏 OS 和托管详细信息,以防 'root' url 被命中。所以我想这样做:
app.Map("/", builder => builder.Use((context, func) => context.Response.WriteAsync(string.Empty)));
但是 - 不允许使用 mapPath 参数“/” - 它不能以斜杠结尾。
app.Use((context, func) => context.Response.WriteAsync(string.Empty));
这也会覆盖 SignalR 虚拟文件夹 (/signal
),从而使集线器无法访问。
这相当于过去在 Web 应用程序文件夹中有空的 index.htm 页面。
您可以编写自己的中间件(这就是 OWIN 的优点)来处理这些请求。我举了一个例子,它将 return statuscode 200 和 return 空:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<OnlySignalRMiddleware>();
app.MapSignalR();
}
}
public class OnlySignalRMiddleware : OwinMiddleware
{
public OnlySignalRMiddleware(OwinMiddleware next) : base(next) { }
public override Task Invoke(IOwinContext context)
{
if (!context.Request.Path.HasValue || context.Request.Path.Value.StartsWith("/signalr"))
return Next.Invoke(context); //continue the pipeline
context.Response.StatusCode = 200;
return context.Response.WriteAsync(""); //terminate the pipeline
}
}
如果需要,您还可以删除一些 headers,方法是:
context.Response.Headers.Remove("Server");
我在 OWIN 自托管应用程序中托管 SignalR - 在 Azure 中,如下所示:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
...
很简单,工作正常。按预期公开 /signalr/hubs
。
我想做的是在有人点击 /
url 时阻止 HTTP 403.14。请求 /
returns HTTP 403.14:
HTTP Error 403.14 - Forbidden
我认为最好通过返回空响应来隐藏 OS 和托管详细信息,以防 'root' url 被命中。所以我想这样做:
app.Map("/", builder => builder.Use((context, func) => context.Response.WriteAsync(string.Empty)));
但是 - 不允许使用 mapPath 参数“/” - 它不能以斜杠结尾。
app.Use((context, func) => context.Response.WriteAsync(string.Empty));
这也会覆盖 SignalR 虚拟文件夹 (/signal
),从而使集线器无法访问。
这相当于过去在 Web 应用程序文件夹中有空的 index.htm 页面。
您可以编写自己的中间件(这就是 OWIN 的优点)来处理这些请求。我举了一个例子,它将 return statuscode 200 和 return 空:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<OnlySignalRMiddleware>();
app.MapSignalR();
}
}
public class OnlySignalRMiddleware : OwinMiddleware
{
public OnlySignalRMiddleware(OwinMiddleware next) : base(next) { }
public override Task Invoke(IOwinContext context)
{
if (!context.Request.Path.HasValue || context.Request.Path.Value.StartsWith("/signalr"))
return Next.Invoke(context); //continue the pipeline
context.Response.StatusCode = 200;
return context.Response.WriteAsync(""); //terminate the pipeline
}
}
如果需要,您还可以删除一些 headers,方法是:
context.Response.Headers.Remove("Server");