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 コンテキスト) を呼び出して、Nancyfx を介して Elmah インターフェイスをパイプしようとしています。

しかし、Elmah.ErrorLogPageFactory は HttpRequest::PathInfo に依存して正しい IHttpHandler を解決し、PathInfo は常に空であるため、機能しません。

PathInfo がどのように機能するかを誰かが時間を割いて説明してくれたら、とても感謝しています!

4

2 に答える 2

2

プロパティは、クラスのプライベート変数にPathInfo基づいて計算されます。このインスタンスを設定する公式の方法はありません。そのため、手動で作成する場合は常にnullであるため、使用も空になります。HttpContextHttpRequestHttpContextHttpRequestHttpContextPathInfo

空の文字列とは異なるものを取得するには、.NET Frameworkによって作成された実際のインスタンスを使用する必要があり、自分でインスタンス化する必要はありません。

于 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 に答える