ASP.NET AJAXでWCFサービスを使い始めました。 JavaScriptからWCFサービスをインスタンス化し、文字列変数を引数として(OperationContractシグネチャを使用して)WCFサービスメソッドに渡します。次に、カスタムJavascriptクラスにバインドされた(DataContractで定義された).NETオブジェクトを返します。 Webセッションにログインしたユーザーに基づいて認証に問題があります。ただし、WCF Webサービスは、HttpContext.Currentオブジェクトへのコンテキストがない完全に異なるサービスです。そのオブジェクトにアクセスする最も安全な方法は何ですか?
AspNetCompatibilityを有効にすると、HttpContext.Current
にアクセスできます。
<configuration>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
</configuration>
これにより、現在のユーザーにアクセスできるようになります:HttpContext.Current.User
-どちらがいいですか。
サービスクラスを追加の属性で装飾することで、AspNetCompatibilityを適用することもできます。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
(System.ServiceModel.Activation
名前空間内。)その属性が設定されている場合、AspNetCompatibilityが有効になっていないと、サービスは開始できません。
デフォルトではHttpContextはありませんが、OperationContext(常に存在)またはWebOperationContext(特定のバインディングでのみ使用可能)に同じオブジェクトが多数存在します。
次のように静的.Current
プロパティを使用して、OperationContextまたはWebOperationContextにアクセスできます:WebOperationContext.Current
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;
}