web-dev-qa-db-ja.com

WCF WebサービスからHttpContext.Currentにアクセスする

ASP.NET AJAXでWCFサービスを使い始めました。 JavaScriptからWCFサービスをインスタンス化し、文字列変数を引数として(OperationContractシグネチャを使用して)WCFサービスメソッドに渡します。次に、カスタムJavascriptクラスにバインドされた(DataContractで定義された).NETオブジェクトを返します。 Webセッションにログインしたユーザーに基づいて認証に問題があります。ただし、WCF Webサービスは、HttpContext.Currentオブジェクトへのコンテキストがない完全に異なるサービスです。そのオブジェクトにアクセスする最も安全な方法は何ですか?

30
MacGyver

AspNetCompatibilityを有効にすると、HttpContext.Currentにアクセスできます。

<configuration>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>
</configuration>

これにより、現在のユーザーにアクセスできるようになります:HttpContext.Current.User-どちらがいいですか。

サービスクラスを追加の属性で装飾することで、AspNetCompatibilityを適用することもできます。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

System.ServiceModel.Activation名前空間内。)その属性が設定されている場合、AspNetCompatibilityが有効になっていないと、サービスは開始できません。

51
mthierba

デフォルトではHttpContextはありませんが、OperationContext(常に存在)またはWebOperationContext(特定のバインディングでのみ使用可能)に同じオブジェクトが多数存在します。

次のように静的.Currentプロパティを使用して、OperationContextまたはWebOperationContextにアクセスできます:WebOperationContext.Current

26
faester

Web.configを変更したくない場合、または変更できない場合:

private string GetClientIPAddress()
        {
            var props = OperationContext.Current.IncomingMessageProperties;
            var endpointProperty = props[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            if (endpointProperty != null)
            {
                if (endpointProperty.Address == "::1" || String.IsNullOrEmpty(endpointProperty.Address))
                    return "127.0.0.1";

                return endpointProperty.Address;
            }

            return String.Empty;
        }
3
nikolai.serdiuk