web-dev-qa-db-ja.com

Webサービス呼び出し用にC#でカスタムSOAPHeaderを追加する

Webサービスを呼び出す前に、c#にカスタムのsoapヘッダー情報を追加しようとしています。私はこれを行うためにSOAPヘッダークラ​​スを使用しています。これを必要な方法で部分的に行うことはできますが、完全に行うことはできません。SOAPヘッダーを次のように表示する必要があります。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header>
      <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <UsernameToken>
         <Username>USERID</Username>
         <Password>PASSWORD</Password>
        </UsernameToken>    
      </Security>
   </soap:Header>
   <soap:Body>
   ...

以下のように石鹸ヘッダーを追加することができます

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header>
      <UsernameToken xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <Username>UserID</Username>
         <Password>Test</Password>
      </UsernameToken>
   </soap:Header>
   <soap:Body>

私ができないことは、最初のサンプルのように「UsernameToken」をラップする「Security」要素を追加することです。どんな助けでもいただければ幸いです。

10
user2810857

このリンク 石鹸ヘッダーを追加 私のために働いた。 SOAP 1.1サービスを呼び出していますが、これは作成しておらず、制御できません。VS2012を使用していて、プロジェクトのWeb参照としてサービスを追加しています。これがお役に立てば幸いです。

J. Dudgeonの投稿からスレッドの下部に向かって手順1〜5を実行しました。

ここにいくつかのサンプルコードがあります(これは別の.csファイルにあります):

_namespace SAME_NAMESPACE_AS_PROXY_CLASS
{
    // This is needed since the web service must have the username and pwd passed in a custom SOAP header, apparently
    public partial class MyService : System.Web.Services.Protocols.SoapHttpClientProtocol
    {
        public Creds credHeader;  // will hold the creds that are passed in the SOAP Header
    }

    [XmlRoot(Namespace = "http://cnn.com/xy")]  // your service's namespace goes in quotes
    public class Creds : SoapHeader
    {
        public string Username;
        public string Password;
    }
}
_

次に、生成されたプロキシクラスで、サービスを呼び出すメソッドで、J Dudgeonのステップ4に従って、次の属性を追加します。[SoapHeader("credHeader", Direction = SoapHeaderDirection.In)]

最後に、生成されたプロキシメソッドの呼び出しをヘッダー付きで示します。

_using (MyService client = new MyService())
{
    client.credHeader = new Creds();
    client.credHeader.Username = "username";
    client.credHeader.Password = "pwd";
    rResponse = client.MyProxyMethodHere();
}
_
2
PBMe_HikeIt