web-dev-qa-db-ja.com

HttpContext.Current.Request.RawUrlに相当するWCFとは何ですか?

純粋なWCFコンテキストで実行されているRESTfulサービスがいくつかあります(つまり、ASP.NET互換性が有効になっていないため、使用可能なHttpContext.Currentオブジェクトがありません)。

サービスへのURLは、リクエストの開始時にIHttpModuleを使用して書き換えられます(その時点ではHttpContextがあり、HttpContext.Current.RewritePathを使用して書き換えられます)。 URLの.svc拡張子のように。

ただし、WCFインフラストラクチャ内から要求された元のURLにアクセスする必要があります。 OperationContextまたはWebOperationContextクラスのどこかにHttpContext.Current.Request.RawUrlに相当するものはありますか? WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUriを使用すると、元のURLではなく書き換えられたURLが返されます。

34
Greg Beech

次の手順を実行すると、現在ターゲットになっているエンドポイントとそのURIを取得できます。

OperationContext.Current.RequestContext.RequestMessage.Headers.To

これは次と同じだと思います:

OperationContext.Current.IncomingMessageHeaders.To

これは System.Uriオブジェクト、そして私はあなたがOriginalStringまたはPathAndQuery、あるいはあなたがそれから望むどんな部分でも得ることができると信じています。

40

次のようなものを試してください。

OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri
2
aditya potdar

私はそれを使用して

OperationContext.Current.RequestContext.RequestMessage.Headers.To

ほとんどの場合動作しますが、私のアプリケーションでは動作しませんでした。これはNLB(Network Load Balancer)の背後にあるため、元の入力ホスト名が失われます。 しかし入力ホストはまだ「Host」という名前のヘッダーにあり、驚くほど取得が困難でした。それはにあります:

System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.Headers["Host"]

System.ServiceModel.OperationContext.Current.IncomingMessageHeadersのヘッダーオブジェクトには、クライアントからのすべてのヘッダーが含まれていませんでした)

1
Abacus