簡體   English   中英

System.Web.HttpRequest::PathInfo 如何工作?

[英]how does System.Web.HttpRequest::PathInfo work?

我試圖了解 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 上下文) 來通過 Nancyfx 管道 Elmah 接口。

但它不起作用,因為 Elmah.ErrorLogPageFactory 依賴於 HttpRequest::PathInfo 來解析正確的 IHttpHandler 並且 PathInfo 始終為空。

如果有人願意花時間解釋 PathInfo 的工作原理,我將不勝感激!

PathInfo屬性是基於HttpRequest類的HttpContext私有變量計算的。 沒有官方的方法來設置這個HttpContext實例。 這就是為什么每當您手動創建HttpRequestHttpContext始終為空,因此PathInfo也使用空。

要獲得與空字符串不同的東西,您需要使用由 .NET 框架為您創建的真實實例,而不是自己實例化它。

我一直在嘗試對 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 設置也是如此

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM