クライアント/ユーザーからの各Web要求で、クライアントアドレスヘッダー(クライアントのIPアドレス)をSOAPヘッダーに追加したいと思います。
私はWCFサービスを使用しており、実装クラスは次のとおりです。
public class Service : IService
{
public Guid UserId()
{
if (MemUser != null)
return (Guid)MemUser.ProviderUserKey;
else
return Guid.Empty;
}
public void SystemLog(Nullable<Guid> Customer, ResultCode Result, FacilityCode Facility, int Code, string Info)
{
// get IP address out of the SOAP header, if any
string clientAddress = string.Empty;
if ((ClientAddress != null) && !String.IsNullOrEmpty(ClientAddress.IPAddress))
clientAddress = ClientAddress.IPAddress;
else if ((HttpContext.Current != null) && (HttpContext.Current.Request != null) && !String.IsNullOrEmpty(HttpContext.Current.Request.UserHostAddress))
clientAddress = HttpContext.Current.Request.UserHostAddress;
SystemLog(Customer, Result, Facility, Code, Info, clientAddress); //writes into database
}
//other methods
}
私のインターフェースは次のようになります。
[ServiceContract(Name = "ServiceSoap", Namespace = "http://www.example.com/webservice"), XmlSerializerFormat]
public interface IService
{
[OperationContract(Action = "http://www.example.com/webservice/UserId")]
Guid UserId();
//other implementations
}
SoapHeaderによって継承されたClientAddressHeaderのクラスがある場合
public class ClientAddressHeader : SoapHeader
{
public string IPAddress;
public ClientAddressHeader(){}
}
次のような[WebMethod]を使用して、wseでSOAPヘッダー(ClientAddress)を簡単に渡すことができます。
[WebService(Namespace = "http://www.example.com/webservice")]
public class Service : System.Web.Services.WebService
{
public ClientAddressHeader ClientAddress;
[WebMethod, SoapHeader("ClientAddress", Direction = SoapHeaderDirection.In)] //client request
public Guid UserId()
{
if (MemUser != null)
return (Guid)MemUser.ProviderUserKey;
else
return Guid.Empty;
}
}
では、WCFを使用するときにSoapHeaderを渡す方法を知っている人はいますか?
誰かが私にこれを達成する方法を明確に説明してくれたら本当に感謝しています。
PS:msdnとAgent Message Inspectorでいくつかのブログを読んだことがありますが、どれも私にとって本当に役立つものではないか、それをよく理解していませんでした。