如果重新写restfull接口的话,定义各种DTO类型就是一个很大的工作量。考虑到webservcie已经定义了很多类型,所以打算采用反射的方式将webservice接口和方法全部提取出来,转化为restfull接口。
代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace XX.WebService.Test
{
public class WebServcieToRestfull
{
/// <summary>
/// 生成API接口
/// </summary>
public void GenerateApiInterfaceClasses()
{
var assembly = Assembly.Load("XX.WebService");
var types = assembly.GetTypes();
//方法,转换为API方法
var typeList = new List<Type>();
foreach (var type in types)
{
var attrs = type.GetCustomAttributes<System.Web.Services.WebServiceBindingAttribute>();
if (attrs.Any())
{
typeList.Add(type);
}
}
foreach (var type in typeList)//接口类
{
var typeName = type.Name.Replace("Service", "");
var methods = type.GetMethods();
var clist = new List<string>();
foreach (var m in methods)
{
var mattr = m.GetCustomAttribute<System.Web.Services.Protocols.SoapDocumentMethodAttribute>();
if (mattr != null)//接口方法
{
var mname = m.Name.Substring(0, 1).ToUpper() + m.Name.Substring(1);
var paras = m.GetParameters();
var rtnType = string.Format("{0}", m.ReturnType.Name);
if (rtnType == "Void")
{
rtnType = string.Format("{0}Response", mname);
}
var mstr = GetAPIMethodStr(mname);
clist.Add(mstr);
if (paras.Any(p => p.IsOut))
{
var outParams = paras.Where(p => p.IsOut).ToArray();
var outMehodStr = GetAPIOutMethodStr(mname, outParams);
clist.Add(outMehodStr);
}
}
}
var classStr = string.Join("\r\n", clist);
var fileStr = GetAPIInteraceNameSpaceStr(typeName, classStr);
using (FileStream fsWrite = new FileStream("I" + typeName + "API.cs", FileMode.OpenOrCreate))
{
byte[] myByte = System.Text.Encoding.UTF8.GetBytes(fileStr);
fsWrite.Write(myByte, 0, myByte.Length);
};
}
}
/// <summary>
/// 生成API类
/// </summary>
public void GenerateApiClasses()
{
var assembly = Assembly.Load("XX.WebService");
var types = assembly.GetTypes();
//方法,转换为API方法
var typeList = new List<Type>();
foreach (var type in types)
{
var attrs = type.GetCustomAttributes<System.Web.Services.WebServiceBindingAttribute>();
if (attrs.Any())
{
typeList.Add(type);
}
}
foreach (var type in typeList)//接口类
{
var typeName = type.Name.Replace("Service", "");
var methods = type.GetMethods();
var clist = new List<string>();
foreach (var m in methods)
{
var mattr = m.GetCustomAttribute<System.Web.Services.Protocols.SoapDocumentMethodAttribute>();
if (mattr != null)//接口方法
{
var mname = m.Name.Substring(0, 1).ToUpper() + m.Name.Substring(1);
var paras = m.GetParameters();