我试图理解System.Web.HttpRequest的PathInfo属性及其设置方式。
为什么在以下示例中为空?
var p = new System.Web.HttpRequest("file.txt","http://file.com/files/file.txt","");
//PathInfo is always empty
return string.IsNullOrEmpty(p.PathInfo)
我试图通过调用Elmah.ErrorLogPageFactory :: ProcessRequest(HttpContext上下文)来管理Elmah接口通过Nancyfx。
但它不起作用,因为Elmah.ErrorLogPageFactory依赖于HttpRequest :: PathInfo来解析正确的IHttpHandler而PathInfo总是为空。
如果有人花时间解释PathInfo如何运作,我将非常感激!
答案 0 :(得分:2)
PathInfo
属性是根据HttpContext
类的HttpRequest
私有变量计算的。没有正式的方法来设置此HttpContext
实例。这就是为什么每当您手动创建HttpRequest
时,HttpContext
始终为空,因此PathInfo
也使用空。
要获得与空字符串不同的内容,您需要使用由.NET框架为您创建的实例,而不是自己实例化。
答案 1 :(得分:1)
我刚刚尝试与Elmah做类似的事情。
我的路线设置如下:
var url = "admin/elmah.axd/{*pathInfo}";
var defaults = new RouteValueDictionary {{"pathInfo", string.Empty}};
var routeHandler = new ElmahHandler();
var route = new Route(url, defaults, routeHandler);
RouteTable.Routes.Add(route);
但是我也发现pathinfo总是空的,所以样式表和其他路径都不起作用。我设法使用反射来实现我的目标,以调用ErrorLogFactory中的底层方法。
private object InvokeMethod(string name, params object[] args)
{
var dynMethod = typeof(ErrorLogPageFactory).GetMethod(name, BindingFlags.Static | BindingFlags.NonPublic);
return dynMethod.Invoke(null, args );
}
然后我的处理程序看起来像这样
public class ElmahHandler : ErrorLogPageFactory, IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var handler = InvokeMethod("FindHandler", requestContext.RouteData.Values["pathInfo"]) as IHttpHandler;
if (handler == null)
throw new HttpException(404, "Resource not found.");
var num = (int)InvokeMethod("IsAuthorized", context);
if (num != 0 && (num >= 0 || HttpRequestSecurity.IsLocal(context.Request) /*|| SecurityConfiguration.Default.AllowRemoteAccess*/))
{
return handler;
}
//new ManifestResourceHandler("RemoteAccessError.htm", "text/html").ProcessRequest(context);
HttpResponse response = context.Response;
response.Status = "403 Forbidden";
response.End();
return null;
}
}
我没有必要让ManifestResourceHandler工作,所以只是注释了它,同样对于allowRemoteAccess设置