純粋な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が返されます。
次の手順を実行すると、現在ターゲットになっているエンドポイントとそのURIを取得できます。
OperationContext.Current.RequestContext.RequestMessage.Headers.To
これは次と同じだと思います:
OperationContext.Current.IncomingMessageHeaders.To
これは System.Uri
オブジェクト、そして私はあなたがOriginalString
またはPathAndQuery
、あるいはあなたがそれから望むどんな部分でも得ることができると信じています。
次のようなものを試してください。
OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri
私はそれを使用して
OperationContext.Current.RequestContext.RequestMessage.Headers.To
ほとんどの場合動作しますが、私のアプリケーションでは動作しませんでした。これはNLB(Network Load Balancer)の背後にあるため、元の入力ホスト名が失われます。 しかし入力ホストはまだ「Host」という名前のヘッダーにあり、驚くほど取得が困難でした。それはにあります:
System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.Headers["Host"]
(System.ServiceModel.OperationContext.Current.IncomingMessageHeadersのヘッダーオブジェクトには、クライアントからのすべてのヘッダーが含まれていませんでした)