1

ヘッダー認証が必要な Web サービスを動的に呼び出そうとしていますが、必要なヘッダー資格情報を渡す方法がわかりません

私のコード:

public object[] GeneratewebserviceProxy(string WSDL)
{
        WebRequest webRequest = WebRequest.Create(WSDL);
        System.IO.Stream requestStream = webRequest.GetResponse().GetResponseStream();
        ServiceDescription description = ServiceDescription.Read(requestStream);
        string sdName = description.Services[0].Name;
        string Method_Name = description.Messages["LoginSoapIn"].Name.Replace("Request", "");
        Method_Name = Method_Name.Replace("SoapIn", "");
        ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
        importer.ProtocolName = "Soap";
        importer.AddServiceDescription(description, null, null);
        CodeNamespace nmspace = new CodeNamespace();
        CodeCompileUnit unit1 = new CodeCompileUnit();
        unit1.Namespaces.Add(nmspace);
        ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);
        object[] objRet = null;
        if (warning == 0)
        {
            CodeDomProvider provider1 = new CSharpCodeProvider();
            string[] assemblyReferences = new string[3]{ "System.Web.Services.dll", "System.Xml.dll", "System.Data.dll" };
            CompilerParameters parms = new CompilerParameters(assemblyReferences);
            CompilerResults results = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromDom(parms, unit1);
            object o = results.CompiledAssembly.CreateInstance(sdName);
            Type t = o.GetType();

            //PropertyInfo credentials = t.GetProperty("Credentials");
            //PropertyInfo credentials = t.GetProperty("Credentials");
           // credentials.SetValue(o, new NetworkCredential(username, passwd), null);

            MethodInfo m = t.GetMethod("Invoke", BindingFlags.NonPublic | BindingFlags.Instance);


            object[] webmethod_param = { "UserName", "Password" };
            object[] objParams = { Method_Name, webmethod_param };
            objRet = (object[])m.Invoke(o, objParams);
            if (objRet.Length > 0)
            {
                objRet = (object[])objRet[0];
            }
        }
        return objRet;
    }

リクエストは次のようになります。

  tem:AuthHeader>
     <tem:Username>UserName</tem:Username>
     <tem:Password>Password</tem:Password>
  </tem:AuthHeader

資格情報を渡すために両方の方法を試しましたが (コードで確認できるように)、何も機能していないようです。

4

2 に答える 2

0

私はまだこれに対する答えを見つけていません。私が探しているのは、soapリクエストのヘッダーでクレデンシャルを渡すことです。そして、クライアントの資格情報で上記で提案された方法ではありません

于 2013-02-25T08:53:37.900 に答える
0

ClientBase オブジェクトから ClientCredentials プロパティを取得する必要があります。(コードの「o」) を設定し、 Username と Password を設定します。

例 :

ClientCredentials.UserName.UserName = "username";
ClientCredentials.UserName.Password = "password";

MSDN から: http://msdn.microsoft.com/it-it/library/ms599072.aspx

ClientCredentials には、ClientBase クラスの ClientCredentials プロパティを介してアクセスします。

于 2013-02-18T15:00:54.907 に答える