11,331
社区成员
发帖
与我相关
我的任务
分享使用工具 win10,vs2019
打开vs2019->创建新项目

选择创建要用到的那些东西 你们懂的


创建就ok了
然后右键项目名

新建项

如下

我自己加了两个简单的方法(加分)等下验证使用(我标记的这个也要加 不然这个方法看不到)

这样就写好了 然后

打开如下这样就好啦!

右键项目名->发布(B)

然后我们选择文件夹

然后点击下去完成就好了

点击这个发布就可以了

然后我们进入我们文件所在的目录

生成的就在这个目录的这个路径下

这样创建以及发布就搞好啦
记住这个路径 后面要在IIS里面使用到哦
这时候要验证一般是直接打开iis进行注册 但是我们可能有这个功能但是没有启用
先去控制面板看一下

查看功能的启用

把这几个功能开起来




勾选完成 确认 等待更新完成
然后就可以运行 IIS 了
Win+R组合键打开运行,输入 Inetmgr 命令

网站->添加网站

这个路径就是前面我们发布的那个路径

然后依照这个步骤设置好

然后去网站里面
按照如下顺序

浏览如下图所示就ok了 恭喜!

如果浏览报错 404 那估计是服务开启那里有问题 麻烦再去看下控制面板那里的程序是不是 有我标志的没有启用
代码如下
我创建了一个类WebserviceDeal来处理(类有点大)
/***********************************************************************************************/
public class WebserviceDeal
{
static bool isCreate = false;
public static readonly object obj = new object();
/// <summary> 输出的dll文件名称 </summary>
private static string m_OutputDllFilename;
/// <summary> WebService代理类名称 </summary>
private static string m_ProxyClassName;
/// <summary> WebService代理类实例 </summary>
private static object m_ObjInvoke;
/// <summary> 接口方法字典 </summary>
private static Dictionary<EMethod, MethodInfo> m_MethodDic = new Dictionary<EMethod, MethodInfo>();
/// <summary> 创建WebService,生成客户端代理程序集文件 </summary>
/// <param webServiceUrl="error">错误信息</param>
/// <returns>返回:true或false</returns>
public static bool CreateWebService(string webServiceUrl)
{
lock (obj)
{
System.Threading.Thread.Sleep(10);
if (isCreate)
return true;
isCreate = true;
try
{
if (!Directory.Exists(".\\DLL"))
{
Directory.CreateDirectory(".\\DLL");
}
if (m_ProxyClassName == null || m_ProxyClassName == "")
{
m_ProxyClassName = GetClassName(webServiceUrl);
}
// error = string.Empty;
m_OutputDllFilename = ".\\DLL\\demo.dll";
//m_ProxyClassName = Proxy.BasalWebService.ToString();
webServiceUrl += "?WSDL";
if (File.Exists(m_OutputDllFilename))
{
File.Delete(m_OutputDllFilename);
} //重新生成dll,防止Web路径发生变化
//使用 WebClient 下载 WSDL 信息。
WebClient web = new WebClient();
Stream stream = web.OpenRead(webServiceUrl);
if (stream == null)
{
//Log.AddMsg(LogLevel.Info, "读取Webserver上的数据为空");
}
else
{
//Log.AddMsg(LogLevel.Info, "已下载 WSDL 信息");
}
//创建和格式化 WSDL 文档。
if (stream != null)
{
// 格式化WSDL
ServiceDescription description = ServiceDescription.Read(stream);
// 创建客户端代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter
{
ProtocolName = "Soap",
Style = ServiceDescriptionImportStyle.Client,
CodeGenerationOptions =
CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync
};
// 添加 WSDL 文档。
importer.AddServiceDescription(description, null, null);
//使用 CodeDom 编译客户端代理类。
CodeNamespace nmspace = new CodeNamespace();
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace);
ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameter = new CompilerParameters
{
GenerateExecutable = false,
// 指定输出dll文件名。
OutputAssembly = m_OutputDllFilename
};
parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll");
// 编译输出程序集
CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
if (!result.Errors.HasErrors)
{
BuildMethods();
return true;
}
else
{
//Log.AddMsg(LogLevel.Error, "反射生成dll文件时异常");
//Log.ShowDialog(LogLevel.Error, "反射生成dll文件时异常,请检查配置文件Web路径是否正确或网络是否正常", "ERROR");
//error = "反射生成dll文件时异常";
}
stream.Close();
stream.Dispose();
}
else
{
//error = "打开WebServiceUrl失败";
//Log.ShowDialog(LogLevel.Error, "打开WebServiceUrl失败,请检查配置文件Web路径是否正确或网络是否正常", "ERROR");
}
}
catch (Exception ex)
{
//Log.AddMsg(LogLevel.Error, ex.Message);
//Log.ShowDialog(LogLevel.Error, "反射生成dll文件时异常\r\n" + ex.Message, "ERROR");
//error = ex.Message;
}
}
return false;
}
/// <summary> 反射构建Methods </summary>
private static void BuildMethods()
{
//Log.AddMsg(LogLevel.Info, $"输出dll文件名:{m_OutputDllFilename},代理类名称:{m_ProxyClassName}");
Assembly asm = Assembly.LoadFrom(m_OutputDllFilename);
//var types = asm.GetTypes();
//输入创建webservice的类的名称
Type asmType = asm.GetType(m_ProxyClassName);
m_ObjInvoke = Activator.CreateInstance(asmType);
if (m_ObjInvoke != null)
{
//Log.AddMsg(LogLevel.Info, "创建代理类实例成功");
}
//var methods = asmType.GetMethods();
var methods = Enum.GetNames(typeof(EMethod)).ToList();
foreach (var item in methods)
{
var methodInfo = asmType.GetMethod(item);
if (methodInfo != null)
{
var method = (EMethod)Enum.Parse(typeof(EMethod), item);
//Log.AddMsg(LogLevel.Info, $"方法名:{method},方法:{methodInfo}");
m_MethodDic.Add(method, methodInfo);
}
}
}
/// <summary> 获取请求响应 </summary>
/// <param name="method">方法</param>
/// <param name="para">参数</param>
/// <returns>返回:XML串</returns>
public static string GetResponseString(EMethod method, params object[] para)
{
string result = null;
object temp;
try
{
if (m_MethodDic.ContainsKey(method))
{
//Log.AddMsg(LogLevel.Info, $"调用方法名:{method}");
//Log.AddMsg(LogLevel.Info, $"客户端代理类实例:{m_ObjInvoke}");
//Log.AddMsg(LogLevel.Info, $"调用方法:{m_MethodDic[method]}");
//Log.AddMsg(LogLevel.Info, $"参数:{para}");
temp = m_MethodDic[method].Invoke(m_ObjInvoke, para);
if (temp != null)
{
result = temp.ToString();
}
else
{
//Log.AddMsg(LogLevel.Info, "读取失败");
}
}
else
{
//Log.AddMsg(LogLevel.Error, "不存在方法名称" + method.ToString());
}
return result;
}
catch (Exception e)
{
//Log.AddMsg(LogLevel.Error, $"异常:{e.Message}");
return result;
}
}
//枚举出接口名
public enum EMethod
{
HelloWorld,
Add
}
/// <summary>
/// WebService代理类名称
/// </summary>
public enum Proxy
{
BasalWebService,
}
public static string GetClassName(string url)
{
string[] parts = url.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
}
}
/***********************************************************************************************/
其中using这些
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Web.Services.Description;
using System.Xml.Serialization;
声明了这个类了 我们就可以在我们的主函数调用这个接口来使用了
我这边会直接生成一个demo.dll然后调用这个dll里面的接口来实现访问webservice
我实验是在命令行使用的调用方法如下
WebserviceDeal.CreateWebService(@"http://localhost:8990/WebService1.asmx");
object[] para = new object[2];
para[0] = 1;
para[1] = 2;
Console.WriteLine(WebserviceDeal.GetResponseString(WebserviceDeal.EMethod.HelloWorld));
Console.WriteLine($"the result:{WebserviceDeal.GetResponseString(WebserviceDeal.EMethod.Add, para)}");
Console.ReadKey();
这里创建的参数就是我们要访问的url
运行结果如下:

至此 完成啦!!
牛的