步骤一:如果本地访问不了webservice地址,则通过远端生成wsdl文件,拷贝到本地用工具生成cs类文件,导入项目中。
1.获取webservice地址;
2.在浏览器中访问webservice地址,此处访问需要在地址后面加上 ?wsdl
例如:原地址:http://42.123.92.137:1010/interface/Hospital_Interface.asmx
访问时:http://42.123.92.137:1010/interface/Hospital_Interface.asmx?wsdl
3.将网页中的数据另存为 (xxx.wsdl)文件,
3.用VS自带工具将上一步生成的(xxx.wsdl)文件通过命令生成 (xxx.cs) 类文件。
(1)直接通过wsdl文件位置生成。公式:wsdl + wsdl文件路径 + /out:+ cs生成文件路径
例:wsdl E:\service.wsdl /out:E:/WebServicetest.cs
(2)生成带有命名空间的cs文件。公式:wsdl + wsdl文件路径 + /n:命名空间名称 +/out:+ cs生成文件路径
例:wsdl E:\service.wsdl /n:test /out:E:/WebServicetest.cs
步骤二:如果本地可以直接访问到webservice地址,直接通过VS工具生成
生成公式:wsdl /n:+命名空间名称+ /out:+cs类文件路径+文件名称.cs+ webservice地址+?wsdl (注意公式里面空格的地方)
例:wsdl /n:xx /out:D:/web.cs http://192.168.0.222/WebSite/Service.asmx?wsdl
1.将webservice地址存放到配置文件中,代码中通过读取地址生成代理类。
///
/// 根据webservice地址生成代理类
///
/// 本地配置文件中webservice地址
///
public static int InitCreatClass(string url)
{
try
{
//使用 XmlTextReader 对象创建和格式化 WSDL 文档
XmlTextReader reader = new XmlTextReader(url + "?wsdl");
ServiceDescription serviceDes = ServiceDescription.Read(reader);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(serviceDes, "", "");
CodeNamespace cnspace = new CodeNamespace(@namespace);
//生成客户端代理类
CodeCompileUnit ccUnit = new CodeCompileUnit();
ccUnit.Namespaces.Add(cnspace);
sdi.Import(cnspace, ccUnit);
CSharpCodeProvider cscProvider = new CSharpCodeProvider();
ICodeCompiler icc = cscProvider.CreateCompiler();
//设置编译参数
CompilerParameters copParameters = new CompilerParameters();
copParameters.GenerateExecutable = false;
copParameters.GenerateInMemory = true;
copParameters.OutputAssembly = "TestWebService.dll";
copParameters.ReferencedAssemblies.Add("System.dll");
copParameters.ReferencedAssemblies.Add("System.XML.dll");
copParameters.ReferencedAssemblies.Add("System.Web.Services.dll");
copParameters.ReferencedAssemblies.Add("System.Data.dll");
//编译代理类
CompilerResults comResults = icc.CompileAssemblyFromDom(copParameters, ccUnit);
if (true == comResults.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in comResults.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return 0;
}
2.访问代理类,调用类中的函数
///
/// 调用代理类函数
///
/// 函数名称
/// 入参
///
public static object InvokeWebService(string methodname, object[] args)
{
try
{
//通过反射调用代理类函数
System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom("TestWebService.dll");
Type t = asm.GetType(classname);
object o = Activator.CreateInstance(t);
System.Reflection.MethodInfo method = t.GetMethod(methodname);
return method.Invoke(o, args);
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
///
/// 函数调用
///
private void TestInvoke()
{
string[] ReqParms = new string[4];//参数数量
ReqParms[0] = "参数1";
ReqParms[1] = "参数2";
ReqParms[2] = "参数3";
ReqParms[3] = "参数4";
//Func_Name 被调用函数名称
string result = InvokeWebServiceD("Func_Name", ReqParms).ToString();
}
构建httprequest帮助类
public partial class HttpHelper
{
private static HttpHelper m_Helper;
///
/// 单例模式
///
public static HttpHelper Helper
{
get { return m_Helper ?? (m_Helper = new HttpHelper()); }
}
///
/// 获取请求的数据
///
/// 请求地址
/// 请求方式
/// 参数
/// 请求编码
/// 响应编码
/// 请求超时时间(毫秒)
/// 请求成功响应信息,失败返回null
public string GetResponseString(string strUrl, ERequestMode requestMode, Dictionary<string, string> parameters, Encoding requestCoding, Encoding responseCoding, int timeout = 300)
{
string url = VerifyUrl(strUrl);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
HttpWebResponse webResponse = null;
switch (requestMode)
{
case ERequestMode.Get:
webResponse = GetRequest(webRequest, timeout);
break;
case ERequestMode.Post:
webResponse = PostRequest(webRequest, parameters, timeout, requestCoding);
break;
}
if (webResponse != null && webResponse.StatusCode == HttpStatusCode.OK)
{
using (Stream newStream = webResponse.GetResponseStream())
{
if (newStream != null)
using (StreamReader reader = new StreamReader(newStream, responseCoding))
{
string result = reader.ReadToEnd();
return result;
}
}
}
return null;
}
///
/// get 请求指定地址返回响应数据
///
/// 请求
/// 请求超时时间(毫秒)
/// 返回:响应信息
private HttpWebResponse GetRequest(HttpWebRequest webRequest, int timeout)
{
try
{
webRequest.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01";
webRequest.Headers.Add("Accept-Language", "zh-cn,en-US,en;q=0.5");
webRequest.Headers.Add("Cache-Control", "no-cache");
webRequest.UserAgent = "DefaultUserAgent";
webRequest.Timeout = timeout;
webRequest.Method = "GET";
// 接收返回信息
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
return webResponse;
}
catch (Exception ex)
{
return null;
}
}
///
/// post 请求指定地址返回响应数据
///
/// 请求
/// 传入参数
/// 请求超时时间(毫秒)
/// 请求编码
/// 返回:响应信息
private HttpWebResponse PostRequest(HttpWebRequest webRequest, Dictionary<string, string> parameters, int timeout, Encoding requestCoding)
{
try
{
// 拼接参数
string postStr = string.Empty;
if (parameters != null)
{
parameters.All(o =>
{
if (string.IsNullOrEmpty(postStr))
postStr = string.Format("{0}={1}", HttpUtility.UrlEncode(o.Key), HttpUtility.UrlEncode(o.Value));
else
postStr += string.Format("&{0}={1}", HttpUtility.UrlEncode(o.Key), HttpUtility.UrlEncode(o.Value));
return true;
});
}
byte[] byteArray = requestCoding.GetBytes(postStr);
webRequest.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01";
webRequest.Headers.Add("Accept-Language", "zh-cn,en-US,en;q=0.5");
webRequest.Headers.Add("Cache-Control", "no-cache");
webRequest.UserAgent = "DefaultUserAgent";
//webRequest.Timeout = timeout;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = byteArray.Length;
webRequest.Method = "POST";
// 将参数写入流
using (Stream newStream = webRequest.GetRequestStream())
{
newStream.Write(byteArray, 0, byteArray.Length);
newStream.Close();
}
// 接收返回信息
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
return webResponse;
}
catch (Exception ex)
{
return null;
}
}
///
/// 验证URL
///
/// 待验证 URL
///
private string VerifyUrl(string url)
{
if (string.IsNullOrEmpty(url))
throw new Exception("URL 地址不可以为空!");
if (url.StartsWith("http://", StringComparison.CurrentCultureIgnoreCase))
return url;
return string.Format("http://{0}", url);
}
}
public enum ERequestMode
{
Get,
Post
}
调用方式
///
/// 测试调用
///
private void TestInvoke()
{
//组织参数
Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("CantonCode", PersonInfo.RegionNumber);
parameters.Add("CardCode", PersonInfo.CardNo);
parameters.Add("Name", txtName.Text);
parameters.Add("CompHosCode", SystemConfigData.HospitalCode);
string _result = HttpHelper.Helper.GetResponseString(url, ERequestMode.Post, parameters, Encoding.Default, Encoding.UTF8);
}
以下是对上面三种方式进行总结。
方式一、
优点:利用地址直接生成cs类,操作方便快捷,发生错误机率小,调用简单;
缺点:如果webservice地址或者内容发生改变,项目必须重新生成cs文件,导致项目维护性差;
采用场景:webservice接口已经趋于稳定,不会有变动的情况下可使用这种方式;
方式二、
优点:将webservice地址放在配置文件中,一旦地址放生变化,只需要修改配置文件即可,项目维护性好;
缺点:对webservice接口要求比较高,不规范的webservice接口,生成代理类时会发生错误;
采用场景:webservice接口规范,且变动小时,可采用此种方式;
方式三、
优点:添加帮助类,然后调用即可,方便快捷,webservice地址放置在配置文件中,易于维护;
缺点:暂时未发现较大缺点;
采用场景:任何webservice接口,均可采用此种方式;
使用推荐:方式三 > 方式一 > 方式二