2010-12-14 19 views
1

次の操作を試みましたが、httpヘッダー(SOAPリクエスト)に資格情報を追加しませんでした。C#を使用してwebservice API呼び出しで資格情報をトランスポートヘッダーとして追加する方法

MyWebService mySrv = new MyWebService(); 

System.Net.CredentialCache sysCredentail = new System.Net.CredentialCache();      
NetworkCredential netCred = new NetworkCredential("admin", "password"); 
sysCredentail.Add(new Uri(strSysURL), "Basic", netCred); 
mySrv.Credentials = sysCredentail; 

ウェブサービスAPIを呼び出すと、資格情報を追加した後で、次のことを期待しています。

SOAP::Transport::HTTP::Client::send_receive: POST http:/myurl/SYS HTTP /1.1 
Accept: text/xml 
Accept: multipart/* 
Accept: application/soap 
Content-Length: 431 
Content-Type: text/xml; charset=utf-8 
Authorization:: Basic YWRtaW46YnJvY2FkZQ== 
SOAPAction: "urn:webservicesapi#getSystemName" 

<?xml version="1.0" encoding="UTF-8"?> 

etc... 

が、認証::基本YWRtaW46YnJvY2FkZQ ==も資格を追加した後に不足しています。 よろしくお願いします。

答えて

0

以下の手順で問題を解決しました。

1)webserivceクラス(WSDLを追加した後に作成された自動生成されたクラス)

2)は、2つの機能GetWebRequestとSetRequestHeaderをオーバーライドから派生したクラスを作成します。

3)は、代わりにWebサービスのオブジェクトを作成する、手順1

4)SetRequestHeaderを用いてヘッダ情報(認証情報)を設定することによって作成されたクラスのオブジェクトを作成します。

5)手順4の後にWebサービスAPIにアクセスすると、認証が機能します。

パブリッククラスMyDerivedService:MyService { プライベートString m_HeaderName; プライベート文字列m_HeaderValue;

//---------------- 
// GetWebRequest 
// 
// Called by the SOAP client class library 
//---------------- 
protected override WebRequest GetWebRequest(Uri uri) 
{ 
    // call the base class to get the underlying WebRequest object 
    HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri); 

    if (null != this.m_HeaderName) 
    { 
     // set the header 
     req.Headers.Add(this.m_HeaderName, this.m_HeaderValue); 
    } 

    // return the WebRequest to the caller 
    return (WebRequest)req; 
} 

//---------------- 
// SetRequestHeader 
// 
// Sets the header name and value that GetWebRequest will add to the 
// underlying request used by the SOAP client when making the 
// we method call 
//---------------- 
public void SetRequestHeader(String headerName, String headerValue) 
{ 
    this.m_HeaderName = headerName; 
    this.m_HeaderValue = headerValue; 
} 

}

例:

MyDerivedService objservice = new MyDerivedService(); 
string usernamePassword = username + ":" + password; 
objservice.SetRequestHeader("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword))); 
objservice.CallAnyAPI(); 
関連する問題