C#之WebService

概述

WebService是网络服务中一项重要的技术,有着非常重要的应用。

WebService接口编写

WebService接口的编写,比较简单,许多教程都有提到,本文不在赘述。大概按以下思路,不熟悉的请自行百度。

  1. 新建WEB项目
  2. 添加 web service
  3. 编写接口方法
  4. 发布

同源调用

WebService的同源调用比较简单,只需要按照以下步骤即可。

  1. 添加服务引用
  2. 实例化webservice
  3. 调用服务的方法

Ajax跨域请求

要想使得服务可以被跨域调用,则需要费一些周章。

配置web.config

<configuration>
<system.web>
<span style="color:#ff0000;"> <webServices>
<protocols>
<add name="HttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
<add name="Documentation"/>
</protocols>
</webServices></span>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<strong><span style="color:#ff0000;"> <httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>
<add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol></span></strong>
</system.webServer>
</configuration>

修改服务

这里贴出WebService 中代码部分,这里我自定义一个返回一个Person集合GetPersonList(),可供Ajax调用。

  • 发布时需要配置[WebService(Namespace = “http://192.168.1.90:5555/”)]//这里定义你发布以后的域名地址。当然本地测试使用localhost就可以。
  • 要放开[System.Web.Script.Services.ScriptService] 的注释。

以上两步做到写接口发布WebService,访问http://192.168.1.90:5555/XXX.asmx 地址。

namespace WebAPI
{
	/// <summary>
	/// Summary description for WebService1
	/// </summary>
	//[WebService(Namespace = "http://localhost:9999/")]//本地测试可以使用localhost。
	[WebService(Namespace = "http://192.168.1.90:5555/")]//这里定义你发布以后的域名地址。
	[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
	[System.ComponentModel.ToolboxItem(false)]
	// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
	[System.Web.Script.Services.ScriptService]//(AJAX调用必须放开注释)
	public class WebService1 : System.Web.Services.WebService
	{
		[WebMethod(Description = "你好世界")]
		public string HelloWorld()
		{
			return "Hello World";
		}
		[WebMethod]
		public string HelloName(string name)
		{
			return "Hello," + name;
		}
		[WebMethod]
		public List<Person> GetPersonList()
		{
			List<Person> lst = new List<Person>();
			lst.Add(new Person { id = 1, name = "小明", age = 34 });
			lst.Add(new Person { id = 1, name = "小明", age = 34 });
			lst.Add(new Person { id = 1, name = "小明", age = 34 });
			lst.Add(new Person { id = 1, name = "小明", age = 34 });
			return lst;
		}
	}
	public class Person
	{
		public int id { get; set; }
		public string name { get; set; }
		public int age { get; set; }
	}
}

Ajax调用

<script type="text/javascript">
$(function () {
$.ajax({
type: "POST", //访问WebService使用Post方式请求
//contentType: "application/json;charset=utf-8", //WebService 会返回Json类型
contentType: "application/xml;charset=utf-8", //WebService 会返回xml类型
url: "http://192.168.1.90:5555/WebService1.asmx/GetPersonList", //调用WebService
data: "{}", //Email参数
dataType: 'xml',
beforeSend: function (x) { x.setRequestHeader("Content-Type", "application/xml; charset=utf-8"); },
error: function (x, e) { },
success: function (response) { //回调函数,result,返回值
//var json = eval('(' + response.d + ')');
var json = $(response).text();
document.write(json);
}
});
});
</script>

动态调用

有些时候,无法通过服务引用的方式调用webservice,必须将调用逻辑全部写在DLL内部。这种情况通常发生在某些软件的插件场景中。

需要引用System.Web.Services

重写WebService服务

以下是固定写法,照抄即可。

namespace my.test
{
    class WebServiceHelper
    {
        #region InvokeWebService
        /// <summary>
        /// 动态调用web服务
        /// </summary>
        /// <param name="url">WSDL服务地址</param>
        /// <param name="methodname">方法名</param>
        /// <param name="args">参数</param>
        /// <returns></returns>
        public static object InvokeWebService(string url, string methodname, object[] args)
        {
            return WebServiceHelper.InvokeWebService(url, null, methodname, args);
        }

        /// <summary>
        /// 动态调用web服务
        /// </summary>
        /// <param name="url">WSDL服务地址</param>
        /// <param name="classname">类名</param>
        /// <param name="methodname">方法名</param>
        /// <param name="args">参数</param>
        /// <returns></returns>
        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) || (classname == ""))
            {
                classname = WebServiceHelper.GetWsClassName(url);
            }

            try
            {
                //获取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url + "?WSDL");
                System.Web.Services.Description.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 icc = new CSharpCodeProvider();

                //设定编译参数
                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 System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.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);

                /*
                PropertyInfo propertyInfo = type.GetProperty(propertyname);
                return propertyInfo.GetValue(obj, null);
                */
            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }

        private static string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');

            return pps[0];
        }
        #endregion
    }
}

调用

public bool SendEmail(string mailto, string subject, string body, string cc) {
	string url = "http://XXXX/FoundationWebService.asmx";
	string[] args = new string[4];
	args[0] = mailto;
	args[1] = subject;
	args[2] = body;
	args[3] = cc;
	object result = WebServiceHelper.InvokeWebService(url, "SendEmail", args);
	
	return (Boolean)result;
}
  • url是调用的WebService地址。
  • SendEmail是调用的方法名。
  • args是调用方法传入的参数。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中调用WebService有三种方式:直接引用、引用wsdl和soap请求。如果开发者可以直接访问到webservice,可以使用直接引用的方式。在Visual Studio中,可以通过添加服务引用来直接引用webservice,系统会自动生成引用代码。然后可以实例化引用的webservice对象来使用。\[2\] 如果无法直接访问webservice,可以使用引用wsdl文件的方式。首先需要获取webservice的wsdl文件,可以通过浏览器打开webservice服务,然后查看服务说明,这就是整个wsdl的内容。将wsdl文件保存为文本文件,然后将后缀名改为wsdl。在Visual Studio中,同样可以通过添加服务引用来引用wsdl文件,将wsdl文件的路径输入到URL中即可。然后可以实例化引用的webservice对象来使用。\[3\] 最后一种方式是使用SOAP请求来调用webservice。这种方式适用于无法直接引用webservice或wsdl文件的情况。可以使用HttpPost请求来发送SOAP请求,并解析返回的SOAP响应。这种方式需要手动构建SOAP请求和解析SOAP响应,相对复杂一些。 总结起来,C#调用webservice可以通过直接引用、引用wsdl和soap请求三种方式来实现。具体选择哪种方式取决于开发者的需求和情况。 #### 引用[.reference_title] - *1* [【C#】调用 webservice 的三种方法总结](https://blog.csdn.net/weixin_44231544/article/details/124922474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C#调用WebService的三种方式](https://blog.csdn.net/m0_43398336/article/details/105082177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值