目录
一.创建Asp.*** web应用以及Web Service服务
(1).运行环境
(2)创建项目
二.创建控制台应用来调用上面创建的Web Service
一.创建Asp.*** web应用以及Web Service服务
(1).运行环境
开发工具: Visual Studio 2022 Current (免费社区版)
框架版本: .*** framework4.7.2,更高的.*** 5 、***6貌似没有默认提供带web service的asp.*** 应用模板了。
确保VS的工作负荷有勾选下方箭头所指的模块
确认环境没有问题之后就可以开始创建项目了。
(2)创建项目
打开vs点创建新项目
选择箭头指向的项目模板,注意是.*** Framework后缀的,带Core的都是版本比较新的框架项目模板,选择好之后点击下一步选择项目存放的路径以及项目命名、解决方案命名、框架版本,
我这里就用默认的命名了,框架我选.*** framework 4.7.2,然后点击创建即可开始下一步。
点击创建进去会出来一个模板进一步的配置,因为我这也只是整个Web Service接口来而已就选空模板,直接在本机跑也不需要Docker之类的
搞定之后直接创建,创建完成后右键项目点添加->新建项->找到Web 服务(AMSX),选择之后点添加就能创建一个web service默认的hello world模板
加上之后直接启动就可以看到一个网页的服务说明以及对应方法的测试路由,以及对应的方法
在调试模式下可以直接通过上面的调用按钮调用指定的方法,这里点一下调用会返回一个xml并转换成网页
打包之后这个操作就不支持了,到这里创建就算完成了。
这里因为打开的文档就是刚刚创建的web服务所以vs会直接把路由跳到这里,如果当前打开的文档不是创建的WebService1类运行起来就会报服务器没有开启目录浏览,所以要像下面设置一下项目属性。
二.创建控制台应用来调用上面创建的Web Service
直接右键解决方案添加一个控制台应用,这里我用HttpCli***类所以用的框架版本是.*** 6
且使用顶级语句,因为就几句话emmmm,发送报文运行一下web服务把报文copy下来就好。
本地测试的时候可以用http直接调用,虽然不知道为什么部署到服务器之后就只能通过Soap协议丢xml报文来调了。下面是代码报文是运行一下web服务把对应方法的post请求直接copy下来
返回的就是一坨xml,箭头指的就是方法返回的Hello world,可以用.***自带的linq来解析很方便,命名空间是这个
using System.Xml.Linq;
这是上面运行的代码。
using System.***.Http.Headers;
var cli*** = new HttpClient();
var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"\r\n<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\r\n" +
" <soap12:Body>\r\n <HelloWorld xmlns=\"http://tempuri.org/\" />\r\n " +
" </soap12:Body>\r\n</soap12:Envelope>";//把请求xml直接copy下来
var httpcotent = new StringContent(xml);//创建一个http字符报文实例,把上面的报文丢进去当正文
httpcotent.Headers.ContentType = MediaTypeHeaderValue.Parse(" application/soap+xml; charset=utf-8");//设置报文的内容标头,一样上启动的页面上copy下来,soap1.1、soap1.2都一样,我这里用的是Soap1.2
var respon = await cli***.PostAsync(requestUri: "http://localhost:56298/WebService1.asmx?op=HelloWorld", content: httpcotent);//uri一样上去打开那个方法从浏览器copy下来
Console.WriteLine(await respon.Content.ReadAsStringAsync());//异步读取服务器返回的所有数据并且转成字符串,这里回复的会是一个xml文本
Console.ReadKey();
下面是使用XDocument类进行解析xml数据的代码
using System.***.Http.Headers;
using System.Xml.Linq;
var cli*** = new HttpClient();
var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"\r\n<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\r\n" +
" <soap12:Body>\r\n <HelloWorld xmlns=\"http://tempuri.org/\" />\r\n " +
" </soap12:Body>\r\n</soap12:Envelope>";//把请求xml直接copy下来
var httpcotent = new StringContent(xml);//创建一个http字符报文实例,把上面的报文丢进去当正文
httpcotent.Headers.ContentType = MediaTypeHeaderValue.Parse(" application/soap+xml; charset=utf-8");//设置报文的内容标头,一样上启动的页面上copy下来,soap1.1、soap1.2都一样,我这里用的是Soap1.2
var respon = await cli***.PostAsync(requestUri: "http://localhost:56298/WebService1.asmx?op=HelloWorld", content: httpcotent);//uri一样上去打开那个方法从浏览器copy下来
var responstr = await respon.Content.ReadAsStringAsync();
Console.WriteLine(responstr);//异步读取服务器返回的所有数据并且转成字符串,这里回复的会是一个xml文本
Console.ReadKey();
Console.WriteLine("下面用XDocument来取返回的值Hello World");
var xd = XDocument.Parse(responstr);//将返回的xml文本转换成XDocument对象
Console.WriteLine(xd.Root?.Value);//因为直接就是一个节点就不用Find了直接root.value
Console.ReadKey();