我在一个OWIN自主应用程序中托管SignalR - 在Azure中,如下所示:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
...
足够简单,工作正常。按预期公开/signalr/hubs
。
我想做的是当有人点击/
网址时阻止HTTP 403.14。请求/
返回HTTP 403.14:
HTTP错误403.14 - 禁止
我认为通过返回空响应来隐藏操作系统和托管详细信息会很好,以防“root”网址被命中。所以我想这样做:
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应用程序文件夹中使用emtpy index.htm页面。
答案 0 :(得分:2)
您可以编写自己的中间件(这就是OWIN之美)来处理这些请求。我做了一个例子,它将返回状态码200并返回空:
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
}
}
如果您愿意,还可以通过执行以下操作删除一些标题:
context.Response.Headers.Remove("Server");