關於soapheader調用,可以參考
C#調用Java的WebService添加SOAPHeader驗證
1.直接調用
已知webservice路徑,則可以直接 添加服務引用--高級--添加web引用 直接輸入webservice URL。這個比較常見也很簡單
即有完整的webservice文件目錄如下圖所示,

也可以在本地IIS根據webservice文件目錄新發布一個webservice,然后程序動態調用,修改Url
public new string Url { set; get; }
2.根據wsdl文件生成webservice 的.cs文件 及 生成dll C#調用
有時沒有這么多文件,只有wsdl文件
wsdl文件可以有別人提供或者根據webservice地址獲取:
http://localhost:8888/WS.asmx?wsdl

Visual Studio 2013->Visual Studio Tools->VS2013 開發人員命令提示

wsdl E:\WS.wsdl /out:WS.cs
G:\Program Files\Microsoft Visual Studio 12.0>wsdl E:\e.wsdl /protocol:SOAP12 /out:e.cs
來指定1.2
3.C# 動態調用WebService
在C#程序中,若要調用WebService,一般是采用"添加Web引用"的方式來實現的。但如果此WebService的URL是在程序運行過程中才能獲得的,那怎么辦呢?那就必須是"動態"調用這個WebService了。
object[] args = new object[1]; args.SetValue("cyy_JS", 0);
DataTable dt = WebServiceHelper.InvokeWebService("http://192.168.0.10/DBMS_CYY/DBMS_Service.asmx", "GetUserTreeListData", args) as DataTable;
using System.IO;
using System.Web.Services.Description;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.CodeDom;
/// <summary>
/// 動態調用WebService
/// </summary>
/// <param name="url">WebService地址</param>
/// <param name="classname">類名</param>
/// <param name="methodname">方法名(模塊名)</param>
/// <param name="args">參數列表</param>
/// <returns>object</returns>
public static object InvokeWebService(string url, string classname, string methodname, object[] args)
{
string @namespace = "ServiceBase.WebService.DynamicWebLoad";
if (classname == null || classname == "")
{
classname = WebServiceHelper.GetClassName(url);
}
//獲取服務描述語言(WSDL)
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);
//生成客戶端代理類代碼
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider();
ICodeCompiler icc = csc.CreateCompiler();
//設定編譯器的參數
CompilerParameters cplist = new CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");
//編譯代理類
CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new StringBuilder();
foreach (CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
//生成代理實例,並調用方法
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + classname, true, true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj, args);
}
private static string GetClassName(string url)
{
string[] parts = url.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
參考 http://blog.csdn.net/chuxiamuxiang/article/details/5731988
