2013-02-18 67 views
0

我试图动态invoce这需要头认证 但我想不出我应该如何传递所需的头凭据的Web服务通行证头参数,以动态调用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 

我用尽两种方式来传递凭据(你可以在本身的鳕鱼e) 但似乎没有工作。

+0

“似乎没有任何工作”:这是否意味着你得到一个错误(如果是这样,什么错误?),或这些值不能从调用后的头部中检索, 要么...? – baldric 2013-02-18 14:34:50

+0

身份验证不起作用。 我没有通过正确的方式 – 2013-02-18 14:40:02

回答

0

您必须从ClientBase对象中检索ClientCredentials属性。 (在代码中的 “O”),并设置用户名和密码:

例如:

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

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

的ClientCredentials通过ClientBase类的ClientCredentials属性访问。

+0

感谢您的答复,但不是我试图实现与评论的代码? 从我所了解的情况来看,客户端凭证和标头凭证不是一回事。 我所做的是: – 2013-02-19 08:14:03

+1

PropertyInfo credentials = t.GetProperty(“Credentials”); PropertyInfo credentials = t.GetProperty(“Credentials”); (o,new NetworkCredential(username,passwd),null); – 2013-02-19 08:17:17

0

我还没有找到答案。 我在寻找的是在肥皂请求的标题中传递凭证。 而不是以上面建议的方式与客户端凭据

+0

传递Soap Header:http://msdn.microsoft.com/en-us/library/whew6x7f(v=vs.80).aspx – 2GDev 2013-02-26 14:36:46