2

我试图了解 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 context) 来通过 Nancyfx 传递 Elmah 接口。

但它不起作用,因为 Elmah.ErrorLogPageFactory 依赖 HttpRequest::PathInfo 来解析正确的 IHttpHandler 并且 PathInfo 始终为空。

如果有人愿意花时间解释 PathInfo 的工作原理,我将不胜感激!

4

2 回答 2

2

PathInfo属性是根据类的HttpContext私有变量计算的HttpRequest。没有正式的方法来设置这个HttpContext实例。这就是为什么每当您HttpRequest手动创建时,HttpContext总是为空,因此PathInfo也使用空。

要获得与空字符串不同的内容,您需要使用由 .NET 框架为您创建的真实实例,而不是自己实例化它。

于 2012-11-19T18:08:06.623 回答
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);

但我也发现路径信息总是空的,所以样式表和附加路径不起作用。我设法使用反射来调用 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 设置

于 2013-07-05T00:50:24.427 回答