//SOA:面向服务架构(Service-Oriented Architecture),是构造分布式系统的方法论,也会提供一些标准和工具
//把大的系统拆成子模块,以服务的形式提供
//一般多个老系统重构的时候还需要一个数据总线,存储服务的地址和调用方式,还可以检测服务的状态(心跳检测)
//分布式服务的框架:dubbo,zookeeper,ocelot(网关)+consul(服务注册和发现)
//分布式事务:
// 1.DTC TransactionScope 必须是Windows,局域网,需要对机器进行配置
// 2.事务补偿 命令,正命令/反命令
// 3.异步队列 把回退动作放到队列中,有延迟,回退会有个等待时间
//.net Remoting .net平台的分布式框架 CS/BS都可以 效率很高,传递的不是值,是引用
//WebService:寄宿在IIS,就是必须包括在网站项目中
//http协议是传输信道协议
//soap协议是数据封装格式:描述不同服务之间的数据交互的一个轻量级协议
//WSDL:webservice discription language 服务描述语言--一个webservice有什么东西怎么用在这里描述
//UDDI:根据WSDL查找服务的机制
//服务端调用WebService添加服务引用,svcUtil.exe自动生成,基于wsdl生成的一个代理
//单元测试更多是为了回归测试
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
namespace MySOA.Web.WebService
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class MyWebService : System.Web.Services.WebService
{
//[WebMethod],要暴露的方法必须有这个特性
//要暴露的方法方法不能重载
//可以直接返回对象
//http传输协议 数据格式是xml
//SoapHeader验证
public CustomSoapHeader SoapHeaderProp { set; get; }
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
public string HelloWorld(int x)
{
return "Hello World";
}
[WebMethod]
[SoapHeaderAttribute("SoapHeaderProp")]
public string GetName(int x, int y)
{
if (!SoapHeaderProp.Validate())
{
throw new SoapException("验证失败", SoapException.ClientFaultCode);
}
return JsonConvert.SerializeObject(new
{
id = 11,
Name = "小王",
Remark = $"x={x},y={y}"
});
}
[WebMethod]
[SoapHeaderAttribute("SoapHeaderProp")]
public UserInfo GetUser(int age)
{
if (!SoapHeaderProp.Validate())
{
throw new SoapException("验证失败", SoapException.ClientFaultCode);
}
return new UserInfo
{
Id = 11,
Name = "小王",
Age = age
};
}
[WebMethod]
[SoapHeaderAttribute("SoapHeaderProp")]
public List<UserInfo> GetUserList(int age)
{
if (!SoapHeaderProp.Validate())
{
throw new SoapException("验证失败", SoapException.ClientFaultCode);
}
return new List<UserInfo>
{
new UserInfo(){
Id = 11,
Name = "小王",
Age = age
},
new UserInfo(){
Id = 11,
Name = "小高",
Age = age
},
};
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services.Protocols;
namespace MySOA.Web.WebService
{
public class CustomSoapHeader : SoapHeader
{
public string UserName { set; get; }
public string PassWord { set; get; }
//必须有一个无参构造类
public CustomSoapHeader()
{ }
public CustomSoapHeader(string userName, string passWord)
{
this.UserName = userName;
this.PassWord = passWord;
}
//验证
public bool Validate()
{
return this.UserName.Equals("小王") && this.PassWord.Equals("123456");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MySOA.Web.WebService
{
public class UserInfo
{
public int Id { set; get; }
public int Age { set; get; }
public string Name { set; get; }
}
}
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MySOA.UnitTestProject.Tests
{
[TestClass]
public class UnitTestWebService
{
//加上这个特性,可以在这个方法中初始化测试对象,加日志等,当然静态构造函数也可以
[TestInitialize]
public void Init()
{
Console.WriteLine("完成初始化");
}
static UnitTestWebService()
{
Console.WriteLine("静态构造函数完成初始化");
}
[TestMethod]
public void TestMethod1()
{
//WebService要使用using,http用完释放
//地址可以在配置中改变
//< endpoint address = "http://localhost:8088/WebService/MyWebService.asmx"
using (MyWebServiceTest.MyWebServiceSoapClient myWebService = new MyWebServiceTest.MyWebServiceSoapClient())
{
MyWebServiceTest.CustomSoapHeader soapHeader = new MyWebServiceTest.CustomSoapHeader();
soapHeader.UserName = "小王";
soapHeader.PassWord = "123456";
//断言:判断结果是否是预期
Assert.AreEqual(myWebService.HelloWorld(), "Hello World");
//Assert.AreEqual(myWebService.HelloWorld(), "Hello World111");
var rst0 = myWebService.GetName(soapHeader, 10, 8);
var rst1 = myWebService.GetUser(soapHeader, 18);
//默认是数组,在配置服务引用中配置下,根据自己需要配置
var rst2 = myWebService.GetUserList(soapHeader, 18);
//配置服务引用中配置称List,但是添加了SoapHeader后又变成了数组,重新引用也不行
//List<MyWebServiceTest.UserInfo> userInfos = myWebService.GetUserList(soapHeader, 18);
}
}
}
}