小工具知识网

当前位置: 首页 > 行业知识 > .NET WebService \ WCF \ WebAPI 部署总结 以及 window 服务 调试,webservice 的安全验证

行业知识

.NET WebService \ WCF \ WebAPI 部署总结 以及 window 服务 调试,webservice 的安全验证

2026-11-13 19:09:17 来源:互联网转载

一、webservice 部署只能部署IIS上,

比较简单,就不做说明了

安全验证:

  1. Form
  2. window身份
  3. 加个参数,token 定时更新
  4. 可以Soapheader

》》》soapheader验证

首先要新建一个类

且这个类必须继承SoapHeader类

且这个类型必须有一个无参的构造函数

 public class CustomSoapHeader:System.Web.Services.Protocols.SoapHeader    {     public string UserName{ get; set; }        public string PassWord{ get; set; }       // 必须有一个无参的构造函数       public CustomSoapHeader()       {}              public CustomSoapHeader( string userName,string passWord)       {       this.UserName=userName;       this.PassWord=passWord;       }       public  bool Validate()       {          // 要从数据库取数 判断的            if(this.UserName = xxx && this.PassWord == xxxx)           return true;           else           {           }       }    }    

然后再 webService中

       public CustomSoapHeader custheader;         //在需要的方法上添加SoapHeader 特性        [WebMethod]        // 定义SoapHeader传递的方向        //SoapHeaderDirection.In;只发送SoapHeader到服务端,该值是默认值         //SoapHeaderDirection.Out;只发送SoapHeader到客户端        //SoapHeaderDirection.InOut;发送SoapHeader到服务端和客户端         //SoapHeaderDirection.Fault;服务端方法异常的话,会发送异常信息到客户端              [SoapHeader("custheader"),Direction = SoapHeaderDirection.InOut)        public bool UserLoad()        {          if(custheader.Validate())          {            if (custheader.Name == "admin" && custheader.Pwd == "123")            {                return true;            }            else            {                return false;            }           }else {           throw new SoapException("身份验证失败",SoapHeaderException.ServerFault.Code)           }        }

在上面代码中需要注意的是,Web Servies中的Web方法需要抛出SoapExcetion异常才能被客户端捕获到,如果在Debug模式下调试运行的话,还需要在异常设置里把这个异常勾选掉,即编译器不对该异常进行捕获。

要调用这个web Service中的UserLoad 方法,需要传递 CustomSoapHeader 对象参数,客户端使用服务端的UserLoad方法,需要传递CustomSoapHeader

//客户端        WebServiceClient  client = new WebServiceClient ();//web引用        CustomSoapHeader  Header = new CustomSoapHeader ();//web引用创建soap头对象          //设置soap头变量          Header.UserName = "zen";          Header.PassWord = "123456";          client.custheader= Header;          //调用web 方法          Response.Write(client.UserLoad()); 

》》》

添加 token 校验安全

二、 WCF 部署 1

                                                                             

wcf 重载

》》每个Operation由一个operation XML Element表示,而每个Operation还应该具有一个能够唯一表示该Operation的ID,这个ID则是通过name属性来定义。Operation元素的Name属性通常使用方法名来定义,所以,如果WCF服务契约中,包含两个相同的操作方法名时,此时就违背了WSDL的规定,这也是WCF不可以使用操作重载的原因。

》》》 d

namespace xxx{    [ServiceContract]    public interface IHelloWorld    {        [OperationContract(Name = "GetHelloWorldWithoutParam")]        string GetHelloWorld();        [OperationContract(Name = "GetHelloWorldWithParam")]        string GetHelloWorld(string name);    }}

》》》》 wcf 配置信息

                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                                

using System.ServiceModel; //服务契约

using System.Runtime.Serialization; //数据契约

》》》 服务契约

 [ServiceContract]    public interface ISayHi    {        [OperationContract]        string ToSayHi();        ///         /// 自我介绍        ///         /// 个人信息        /// 返回个人介绍        [OperationContract]        string Introduce(Person person);    }

》》》》 数据契约

  [DataContract]    public class Person    {        [DataMember(Name="ShortName")] //定义别名        public string Name { get; set; }        [DataMember]        public int Age { get; set; }        [DataMember]        public string Country { get; set; }         public string Introduce()        {            return string.Format("Hello,my name is {0}.I am {1} years old.I am from {2}.", Name, Age, Country);        }    }

注意DataMember属性,可以控制字段的可见性。默认是都可见,如果DataMember属性在类中出现,则没有添加该属性的字段不可见。

部署到IIS 跟部署 webservice 部署方法一样的

wcf 部署2

部署到控制台 要以管理员运行vs,或者 管理员运行 控制台的exe

在控制器项目中

创建IUserInfoService 接口

》》》Abort( ) 方法不会抛出异常, 而 Close( )方法则可能抛出 TimeoutException 和 CommunicationException。

using System;using System.Collections.Generic;using System.Linq;using System.ServiceModel;using System.Text;using System.Threading.Tasks;namespace ConsoleApp1{    [ServiceContract]    public interface  IUserInfoService    {        [OperationContract]        int Add(int a, int b);    }}

实现接口

在app.config中增加

                                                                                                                                                                                       

《《《启动服务

》》》验证是否有效

》》》如果不放在配置文件中

》》》

 using (ServiceHost host = new ServiceHost(typeof(UserInfoService)))            {                向宿主中添加终结点                host.AddServiceEndpoint(typeof(IUserInfoService), new WSHttpBinding(), "http://localhost:8686/userinfoservice");                 if (Host.Description.Behaviors.Find() == null)                {                ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();                behavior.HttpGetEnabled = true;                behavior.HttpGetUrl = new Uri("http://localhost:8686/userinfoservice/metadata");                host.Description.Behaviors.Add(behavior);                host.Opened +=delegate                {                     Console.WriteLine("服务已启动");                };                host.Open();                             Console.ReadKey();                host.Close();                }            }

或者

           //创建宿主的基地址            Uri baseAddress = new Uri("http://localhost:8080/User");            //创建宿主            using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))            {                //向宿主中添加终结点                host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");                //将HttpGetEnabled属性设置为true                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();                smb.HttpGetEnabled = true;                //将行为添加到Behaviors中                host.Description.Behaviors.Add(smb);                //打开宿主                host.Open();                Console.WriteLine("WCF中的HTTP监听已启动....");                Console.ReadLine();                host.Close();            }

》》》 校验是否成功

部署到winform

 private void button1_Click(object sender, EventArgs e)        {            ServiceHost Host = new ServiceHost(typeof(WCF.Student));                            //绑定                System.ServiceModel.Channels.Binding httpBinding = new BasicHttpBinding();                //终结点                Host.AddServiceEndpoint(typeof(IWCF.IStudent), httpBinding, "http://localhost:8002/");                if (Host.Description.Behaviors.Find() == null)                {                    //行为                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();                    behavior.HttpGetEnabled = true;                    //元数据地址                    behavior.HttpGetUrl = new Uri("http://localhost:8002");                    Host.Description.Behaviors.Add(behavior);                    //启动                    Host.Open();                            }        }

》》》验证

app.config 配置

                                                                                                                                                             

》》》》验证

WCF 宿主 服务中

》》》 app.config 或者写作code 都行

LocalService:充当本地计算机上非特权用户的帐户,该帐户将匿名凭据提供给所有远程服务器。

NetworkService:提供广泛的本地特权的帐户,该帐户将计算机的凭据提供给所有远程服务器。

LocalSystem:服务控制管理员使用的帐户,它具有本地计算机上的许多权限并作为网络上的计算机。

User:由网络上特定的用户定义的帐户。如果为 ServiceProcessInstaller.Account 成员指定 User,则会使系统在安装服务时提示输入有效的用户名和密码,除非您为 ServiceProcessInstaller 实例的 Username 和 Password 这两个属性设置值。

删除服务

sc delete 服务名称

window 服务调试

正常是无法调试的,可以在window服务中做调整

如下

                                    
 public partial class Service1 : ServiceBase    {         //服务配置项        private static string ServiceStart = ConfigurationManager.ConnectionStrings["ServiceStart"].ConnectionString;        private static int ServiceInterval = Convert.ToInt32(ConfigurationManager.ConnectionStrings["ServiceInterval"].ConnectionString);        private static string ServiceEnd = ConfigurationManager.ConnectionStrings["ServiceEnd"].ConnectionString;        private static string ServiceIsOn = ConfigurationManager.ConnectionStrings["ServiceIsOn"].ConnectionString;         //服务定时器        private System.Timers.Timer timer = new System.Timers.Timer();         public Service1()        {            InitializeComponent();        }         ///         /// 开启服务        ///         ///         protected override void OnStart(string[] args)        {            if (ServiceIsOn == "1")            {                timer.Enabled = true;                timer.Interval = ServiceInterval * 1000;//执行间隔时间,单位为毫秒; 这里实际间隔为1秒钟                  timer.Start();                timer.Elapsed += new System.Timers.ElapsedEventHandler(Procedure_Timer);                Procedure_Timer(null, null);            }        }          ///         /// 定时器执行        ///         ///         ///         private void Procedure_Timer(object sender, System.Timers.ElapsedEventArgs e)        {            timer.Enabled = false;            TestClass service = new TestClass();             DateTime newDate = DateTime.Now;             //获取当前时间            int intHour = newDate.Hour;            int intMinute = newDate.Minute;             //开始时间            string[] startStamp = ServiceStart.Split(':');            int startHour = Convert.ToInt32(startStamp[0]);            int startMinute = Convert.ToInt32(startStamp[1]);             //结束时间            string[] endStamp = ServiceEnd.Split(':');            int endHour = Convert.ToInt32(endStamp[0]);            int endMinute = Convert.ToInt32(endStamp[1]);             int newTime = (intHour * 100) + intMinute;            int startTime = (startHour * 100) + startMinute;            int endTime = (endHour * 100) + endMinute;                    // 每天定点在一个时间段内执行            if (newTime >= startTime && newTime                 //执行业务代码                //            }             timer.Enabled = true;          }           ///             timer.Stop();        }    }    public partial class Service1 : ServiceBase    {        public Service1()        {            InitializeComponent();        }        protected override void OnStart(string[] args)        {            GLog.WLog("服务已启动");        }        protected override void OnStop()        {            GLog.WLog("服务已停止");        }    }}         public static class GLog    {        static object _lockObj = new object();        public static void WLog(string content)        {            lock (_lockObj)            {                string curPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);                string logDir = "Logs";                string logDirFullName = Path.Combine(curPath, logDir);                try                {                    if (!Directory.Exists(logDirFullName))                        Directory.CreateDirectory(logDirFullName);                }                catch { return; }                string fileName = "Logs" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";                string logFullName = Path.Combine(logDirFullName, fileName);                try                {                    using (FileStream fs = new FileStream(logFullName, FileMode.Append, FileAccess.Write))                    using (StreamWriter sw = new StreamWriter(fs))                        sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " " + content);                }                catch { return; }            }        }    }}    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {        }        ///             try            {                //是否存在服务                if (ServiceUtil.ServiceIsExisted(_winSvcName))                {                    //已存在,检查是否启动                    if (ServiceUtil.IsRun(_winSvcName))                    {                        //服务是已启动状态                        lblMsg.Text = "[001]服务是已启动状态";                    }                    else                    {                        //未启动,则启动                        ServiceUtil.StarService(_winSvcName);                        lblMsg.Text = "[002]服务是已启动状态";                    }                }                else                {                    //不存在,则安装                    IDictionary mySavedState = new Hashtable();                    string curPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);                    string apppath = Path.Combine(curPath, _winSvcExeName);                    ServiceUtil.InstallService(mySavedState, apppath);                    lblMsg.Text = "[003]服务是已启动状态";                    //安装后并不会自动启动。需要启动这个服务                    ServiceUtil.StarService(_winSvcName);                    lblMsg.Text = "[004]服务是已启动状态";                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }        }        private void btnUninstall_Click(object sender, EventArgs e)        {            //** 卸载服务最重要的是先停止,否则电脑需要重启或注销 **            try            {                //是否存在服务                if (!ServiceUtil.ServiceIsExisted(_winSvcName))                {                    MessageBox.Show("服务不存在,不需要卸载");                    return;                }                //如果服务正在运行,停止它                if (ServiceUtil.IsRun(_winSvcName))                {                    ServiceUtil.StopService(_winSvcName);                }                //再检查一次是否在运行                if (ServiceUtil.IsRun(_winSvcName))                {                    MessageBox.Show("服务无法停止,请手动停止这个服务");                    return;                }                //卸载                ServiceUtil.UnInstallServiceByName(_winSvcName);                lblMsg.Text = "[005]服务已卸载";            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }        }    }}    ///         ///             bool IsRun = false;            try            {                if (!ServiceIsExisted(name)) return false;                var sc = new ServiceController(name);                if (sc.Status == ServiceControllerStatus.StartPending || sc.Status == ServiceControllerStatus.Running)                {                    IsRun = true;                }                sc.Close();            }            catch            {                IsRun = false;            }            return IsRun;        }        ///             try            {                var sc = new ServiceController(name);                if (sc.Status == ServiceControllerStatus.Stopped || sc.Status == ServiceControllerStatus.StopPending)                {                    sc.Start();                    sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10));                }                else                {                }                sc.Close();                return true;            }            catch (Exception ex)            {                throw ex;            }        }        ///             try            {                var sc = new ServiceController(name);                if (sc.Status == ServiceControllerStatus.Running || sc.Status == ServiceControllerStatus.StartPending)                {                    sc.Stop();                    //停止服务超时时间:56秒。                    sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 56));                }                else                {                }                sc.Close();                return true;            }            catch (Exception ex)            {                throw ex;            }        }        ///             ServiceController[] services = ServiceController.GetServices();            foreach (ServiceController s in services)                if (s.ServiceName.ToLower() == serviceName.ToLower())                    return true;            return false;        }        ///             try            {                AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();                myAssemblyInstaller.UseNewContext = true;                myAssemblyInstaller.Path = filepath;                myAssemblyInstaller.Install(stateSaver);                myAssemblyInstaller.Commit(stateSaver);                myAssemblyInstaller.Dispose();            }            catch (Exception ex)            {                throw ex;            }        }        ///             try            {                AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();                myAssemblyInstaller.UseNewContext = true;                myAssemblyInstaller.Path = filepath;                myAssemblyInstaller.Uninstall(null);                myAssemblyInstaller.Dispose();            }            catch (Exception ex)            {                throw ex;            }        }        ///             ProcessStartInfo pStart = new ProcessStartInfo("sc.exe");            Process pRoc = new Process();            pStart.Arguments = " delete " + WinServiceName;            pStart.UseShellExecute = false;            pStart.CreateNoWindow = false;            pRoc.StartInfo = pStart;            pRoc.Start();            pRoc.WaitForExit();        }            }}                       RegisterWebApi("http://localhost:4554");        }        private static void RegisterWebApi(string url)        {                          var config = new HttpSelfHostConfiguration(url);                config.Routes.MapHttpRoute(                    "API Default",                     "api/{controller}/{action}/{id}",                    new { id = RouteParameter.Optional });                using (HttpSelfHostServer server = new HttpSelfHostServer(config))                {                    server.OpenAsync().Wait();                    Console.WriteLine("Press Enter to quit.");                    Console.ReadLine();                }                 }                    id = RouteParameter.Optional                });            app.UseWebApi(config);            string baseAddress = "http://localhost:9527/";            using (WebApp.Start(url: baseAddress))            {                Console.WriteLine("请开始您的表演");                Console.ReadLine();            }        }

上一篇:HC含义深度解析,探究缩写背后的真实内涵

下一篇:揭秘核心要点,内容主旨一目了然!