精华内容
下载资源
问答
  • 在本文详细介绍 WebApi 自托管于 WinForms 中, WPF 或 Console 程序实现类似. 0. 完整示例演示# 1. 新建解决方案以及 WinForms 工程# 1.1. 新建解决方案及工程# 如下图所示: 建立空白解决方案及 Winforms ...

    在 Windows 平台 Web 服务一般托管于 IIS. 在开发中, 会遇到 WinForms 或 WPF 服务端程序需要提供对外 API 作为服务. 在本文详细介绍 WebApi 自托管于 WinForms 中, WPF 或 Console 程序实现类似.

    0. 完整示例演示#

    示例演示

    1. 新建解决方案以及 WinForms 工程#

    1.1. 新建解决方案及工程#

    如下图所示:

    解决方案结构

    • 建立空白解决方案及 Winforms 工程,
    • 新建 Controllers 文件夹用于存放 WebApi 代码,
    • 新建 Services 文件夹用于存放服务代码.

    1.2. 拖拽控件#

    绘制必要控件, 布局如下:

    窗体布局

    备注: 绘制一个 NumericUpDown 和两个 Button 控件.

    1.3. 引用相关开发包:#

    • Microsoft.AspNet.WebApi.Client
    • Microsoft.AspNet.WebApi.Core
    • Microsoft.AspNet.WebApi.SelfHost

    2. 开发 HTTP 服务类#

     

    Copy

    /// <summary> /// HTTP service. /// </summary> public class HttpService : IDisposable { /// <summary> /// HTTP server's listening port. /// </summary> public int Port { get; set; } /// <summary> /// HTTP self hosting. /// </summary> private readonly HttpSelfHostServer _server; /// <summary> /// HTTP server. /// </summary> /// <param name="port">Listening port.</param> public HttpService(int port) { this.Port = port; var config = new HttpSelfHostConfiguration($"http://0.0.0.0:{this.Port}"); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}"); _server = new HttpSelfHostServer(config); } #region HTTP Service /// <summary> /// start HTTP server. /// </summary> public Task StartHttpServer() { return _server.OpenAsync(); } /// <summary> /// Close HTTP server. /// </summary> public Task CloseHttpServer() { return _server.CloseAsync(); } #endregion /// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> public void Dispose() { _server?.Dispose(); } }

    WebApi 自托管服务主要由 HttpSelfHostServer 实现, 其 OpenAsync 开启 HTTP 监听, CloseAsync 关闭 HTTP 监听.

     

    Copy

    config.MapHttpAttributeRoutes();

    可以在 Controller 中使用路由特性.

    3. 调用 HTTP 服务#

    在 MainForm 窗体程序中引用 HTTP 服务:

     

    Copy

    public class MainForm:Form { /// <summary> /// Http service. /// </summary> private HttpService _http; }

    3.1. 编写开启 HTTP 服务代码#

     

    Copy

    /// <summary> /// start the http server. /// </summary> private async void StartButton_Click(object sender, EventArgs e) { /** * start. */ try { var port = Convert.ToInt32(this.PortNum.Value); /** * initialize http service. */ _http = new HttpService(port); await _http.StartHttpServer(); } catch (Exception exception) { MessageBox.Show($"{exception.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

    3.2. 编写关闭 HTTP 服务代码#

     

    Copy

    /// <summary> /// close the http server. /// </summary> private async void CloseButton_Click(object sender, EventArgs e) { /** * close. */ try { await _http.CloseHttpServer(); _http.Dispose(); } catch (Exception exception) { MessageBox.Show($"{exception.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

    4. 开发控制器#

     

    Copy

    /// <summary> /// Home controller. /// </summary> [RoutePrefix("api/home")] public class HomeController : ApiController { /// <summary> /// Print the greetings /// </summary> /// <param name="name">visitor</param> /// <returns>greetings</returns> [Route("echo")] [HttpGet] public IHttpActionResult Echo(string name) { return Json(new {Name = name, Message = $"Hello, {name}"}); } }

    5. 合在一起#

    解决方案完整结构

    下载完整示例代码 (GitHub)

    6. 注意事项#

    程序需要拥有 管理员权限 才能开启 HTTP 监听, 在调试时, 若 Visual Studio 为拥有管理员权限, 则无法正常运行. 同样地, 在程序编译生成之后运行时亦需要权限.

    作者: 芯芊

    出处:https://www.cnblogs.com/xixixiao/p/run-self-hosting-owin-web-api-inside-winforms.html

    版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

    展开全文
  • 前言 今天研究了在 WPF 中使用 SelfHost 自宿主。 具体的功能是,在 WPF 中使用自宿主服务,外部调用服务的 API...现在已有的资料中,使用 SelfHost 做自宿主服务的基本都是用控制台实现 WebAPI 的功能,或者在 ...

    前言

    今天研究了在 WPF 中使用 SelfHost 自宿主。 具体的功能是,在 WPF 中使用自宿主服务,外部调用服务的 API,在 API 里面操作窗体的显示等。

    技术点

    1. 在 WPF 中集成 SelfHost
    2. API 和窗体间交互

    一、集成 SelfHost

    现在已有的资料中,使用 SelfHost 做自宿主服务的基本都是用控制台实现 WebAPI 的功能,或者在 WinFrom 中集成。WFP 和这些还是有挺大的区别。 我这里是参考了这个文章:Self-Host 
    具体的步骤如下: 
    1. 添加引用包 
    在 NuGet 中添加 “Microsoft.AspNet.WebApi.SelfHost”和“Microsoft.AspNet.WebApi.Cors”库,其他依赖的类库基本都会添加进来 
    2. 初始化服务 
    新建类 “InitConfig”在类里添加初始化自宿主的一些设置。 
    具体代码如下: 

            public static HttpSelfHostConfiguration InitSelfHostConfig(string baseAddress)
            {
                // 配置 http 服务的路由
                HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(baseAddress);
                config.Routes.MapHttpRoute(
                    "API Default", "api/{controller}/{id}",
                    new { id = RouteParameter.Optional }
                );
    
                // 设置跨域
                var cors = new EnableCorsAttribute("*", "*", "*"); //跨域允许设置
                config.EnableCors(cors);
    
                config.Formatters
                   .XmlFormatter.SupportedMediaTypes.Clear();
    
                //默认返回 json
                config.Formatters
                    .JsonFormatter.MediaTypeMappings.Add(
                    new QueryStringMapping("datatype", "json", "application/json"));
    
                //返回格式选择
                config.Formatters
                    .XmlFormatter.MediaTypeMappings.Add(
                    new QueryStringMapping("datatype", "xml", "application/xml"));
    
                //json 序列化设置
                config.Formatters
                    .JsonFormatter.SerializerSettings = new
                    Newtonsoft.Json.JsonSerializerSettings()
                    {
                        //NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
                        DateFormatString = "yyyy-MM-dd HH:mm:ss" //设置时间日期格式化
                    };
                return config;
            }

      这里返回的会在新建服务的时候调用

    3. 添加 Program 类

    WPF 默认是没有这个类的,需要自己手动添加这样的一个类。

    这个类的代码:

            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                string baseAddress = string.Format("http://{0}:{1}/",
                       System.Configuration.ConfigurationManager.AppSettings.Get("Domain"),
                       System.Configuration.ConfigurationManager.AppSettings.Get("APIPort"));
                using (var server = new HttpSelfHostServer(InitConfig.InitSelfHostConfig(baseAddress)))
                {
                    server.OpenAsync().Wait();
                    Console.WriteLine(String.Format("host 已启动:{0}", baseAddress));
                    App app = new App();
                    app.Run();
                }
            }
    

      其中 baseAddress 是拼接的服务地址,同时在“属性”里设置项目的启动对象为“Program”。

    后面添加一些 API 进行测试。

        public class HomeController : ApiController
        {
            [HttpGet]
            public object Get()
            {
                return new { code = 1, msg = "OK HomeController" };
            }
        }
    

      运行项目在浏览器输入对应的地址即可。

    二、API 和窗体交互

    由于 API 是另外定义的类。不能直接操作窗体,新建窗体实例、传递窗体都有问题。

    这里用的是“事件跨类调用”,参考了“C#通过事件跨类调用WPF主窗口中的控件”。

    新建一个类继承“EventArgs”:

        public class MessageArgs : EventArgs
        {
            public MessageArgs(string comMessage)
            {
                this.ComMessage = comMessage;
            }
    
            public string ComMessage { get; set; }
    
        }
    

      在 ApiController 中定义事件、触发事件:

        public class PlayController : ApiController
        {
    
            public static event EventHandler<MessageArgs> PartEvent; //定义在 PlayController 中的一个事件,参数是MessageArgs对象
    
    
            public static void InFunction(string comMessage)
            {
                var messageArg = new MessageArgs(comMessage);
                PartEvent?.Invoke(null, messageArg);  //触发事件,执行所有注册过的函数
            }
    
            [HttpGet]
            public object Play(string comd)
            {
                InFunction(comd);
                return new { code = 0, msg = "成功播放!" };
            }
        }
    

      在窗体中注册上面的事件,以及里面的具体逻辑:

            public MainWindow()
            {
                InitializeComponent();
    
                PlayController.PartEvent += OnStep;  //将该类中的函数注册到Monitor静态类的PartEvent事件中。
            }
    
            /// <summary>
            /// 订阅 Monitor 的PartEvent事件,当触发PartEvent事件时(可能并不在类MainWindow对象中),被注册的函数就行做出相应的响应。
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="message"></param>
            public void OnStep(Object sender, MessageArgs message)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        DoCommand(message.ComMessage);
                    }));
            }
    

      这样,API 接可以和窗体进行通信。

    总结

    到这里,整个的功能都已经完成。

    在自己预研的时候,也是一步一步的。从集成,一点点的改进。

    到API和窗体通信,也查了看了一些方法。最终选的这些思路。

    转载于:https://www.cnblogs.com/zhurong/p/10672128.html

    展开全文
  •  ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。 一、定义Web API 二、Web API入门 “新建”->“项目”,已安装下的 “模板” ->Visual C# -> Web -> ASP.NET

    ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务。 ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。

    一、定义Web API

    二、Web API入门

    “新建”->“项目”,已安装下的 “模板” ->Visual C# -> Web -> ASP.NET WEB 应用程序



    三、编写API控制器

    1、ValuesController

    和MVC控制器区别:
    (1)、所有API控制器的基类是 System.Web.Http.ApiController
    (2)、控制器方法返回的是原始对象,而不是视图
    (3)、Web Api控制器默认根据HTTP动词调度操作(MVC控制器是名称调度操作)

        /// <summary>
        /// 所有API控制器的基类是 System.Web.Http.ApiController
        /// </summary>
        public class ValuesController : ApiController
        {
            //控制器方法返回的是原始对象,而不是视图
            //Web Api控制器默认根据HTTP动词调度操作(MVC控制器是名称调度操作)
            // GET api/values
            public IEnumerable<string> Get()
            {
                return new string[] { "value1", "value2" };
            }
    
            // GET api/values/5
            public string Get(int id)
            {
                return "value";
            }
    
            // POST api/values
            public void Post([FromBody]string value)
            {
            }
    
            // PUT api/values/5
            public void Put(int id, [FromBody]string value)
            {
            }
    
            // DELETE api/values/5
            public void Delete(int id)
            {
            }
        }

    2、异步设计:IHttpController


    public HttpRequestMessage Request { get; set; }
    //异步执行
    public virtual Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken);


    3、传入的操作参数

    4、操作返回值、错误和异步


    四、配置WEB API

    1、Web托管WebAPI的配置
    默认的MVC项目模板都是Web托管项目,因为MVC仅支持Web托管。
    App_Start文件夹下的WebApiConfig.cs

            public static void Register(HttpConfiguration config)
            {
                // Web API configuration and services
    
    
                // Web API routes
                config.MapHttpAttributeRoutes();
    
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
    Global.asax文件
            protected void Application_Start()
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }
    2、自托管WebAPI的配置
    与Web API一起发布的另外两个托管(Web API 宿主):
    WCF自托管:System.Web.Http.SelfHost.dll
    OWIN自托管:System.Web.Http.Owin.dll
    主要用在Web项目外托管API。


    使用NuGet安装合适的自托管WebAPI包( Microsoft.AspNet.WebApi.SelfHost 和  Microsoft.AspNet.WebApi.OwinSelfHost).
    两个包安装之后就会自动包含所有的System.Net.Http和System.Web.Http依赖。





    当使用自托管时,我们需要正确地创建配置,启动和停止WebApi服务器。


    (1)、配置WCF自托管

                 我们需要实例化的配置类是 HttpSelfHostConfiguraion ,因为它通过要求一个监听的URL扩展了基类HttpConfiguration。
    启动代码:

    var config=new HttpSelfHostConfiguraion("http://localhost:8080/");
    config.Routes.MapHttpRoute(
    	name:"DefaultApi",
    	routeTemplate:"api/{controller}/{id}",
    	defaults:new {id=RouteParameter.Optional}
    );
    var server=new HttpSelfHostServer(config);
    server.OpenAsync().Wait();
    完成后,我们应该关闭服务器:
    server.CloseAsync().Wait();
    如果在控制台应用程序中是自托管,我们应该在Main函数中运行这些代码。
    如果应用程序开发框架允许编写异步启动和关闭代码,我们可以用异步代码 async和await代替.Wait()调用


    (2)、配置OWIN自托管 OWIN(Open Web Interface for .NET)

    可以帮助将应用程序与托管环境和运行应用程序的Web服务器隔离开。这样一来,可以让编写的应用程序托管在IIS内,自定义Web服务器内,甚至ASP.NET内。
    OWIN将Web服务器从Web应用程序中抽象出来,所以还需要选择一种方式将应用程序连接到选择的Web服务器。
    基于控制台的OWIN自托管应用程序代码:

    using(WebApp.Start<Startup>("http://localhost:8080/"))
    {
         Console.WriteLine("Server is running. Press Enter to quit.");
         Console.ReadLine();
    }
    class Startup
    {
      public void Configuration(IAppBuilder app)
      {
         var config=new HttpConfiguration();
         config.Routes.MapHttpRoute(
         name:"DefaultApi",
         routeTemplate:"api/{controller}/{id}",
         defaults:new {id=RouteFarameter.Optional}
      );
    }


    (3)、选择WCF或OWIN自托管
                 ASP.NET Web API提供了两种不同的自托管方案,建议使用新的OWIN自托管

    五、向Web API添加路由

    Web API路由注册是MapHttpRoute扩展方法。
                // Web API routes
                config.MapHttpAttributeRoutes();
    
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );


    六、 绑定参数
    七、 过滤请求
    八、 启用依赖注入 
    九、 探索API编程
    十、 跟踪应用程序 
    十一、Web API示例:ProductsController

    展开全文
  • 首先,你要申请证书,然后导入到证书里面: 具体步骤:运行–MMC命令,进入如下界面进行设置: 一直点下一步直到完成,然后将证书导入到个人里面 这个时候进入cmd程序运行如下命令: //添加端口 ...

    首先,你要申请证书,然后导入到证书里面:
    具体步骤:运行–MMC命令,进入如下界面进行设置:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一直点下一步直到完成,然后将证书导入到个人里面
    在这里插入图片描述
    这个时候进入cmd程序运行如下命令:

    //添加端口
    netsh http add sslcert ipport=服务器ip:端口号 certstorename=Root certhash=证书指纹 appid=Guid
    //删除端口,如果以前设置过,需要执行以下命令
    netsh http delete sslcert ipport=服务器ip:端口号
    //查看设置过的端口
    netsh http show sslcert
    
    
    展开全文
  • WebApi的几种寄宿方式

    千次阅读 2015-07-18 00:54:06
    ASP.NET Web API具有与ASP.NET MVC类似的编程方式,相关内容较少,如下通过一个实例讲解WebApi的集中寄宿方式。  目录  构建解决方案  定义Web API  以Web Host方式寄宿Web API  以Self Host方式寄宿Web...
  • 在.net平台下,有大量的技术让你创建一个HTTP...我分享一下我对Web Service、WCF以及Web API的看法。  Web Service  1、它是基于SOAP协议的,数据格式是XML  2、只支持HTTP协议  3、它不是开源的,但可以...
  • public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 //config.MapHttpAttr...
  • wpf中使用selfhost自宿主方式启动web服务作为服务端,暴露apicontroller,客户端用httpclient,模拟web的get/post请求方式,上传图片和通信。
  • 引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以采用Self Host ...本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务...
  • 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作 作者:webabcd 介绍 asp.net mvc 之 asp...
  • 一款非常好的WPF编程宝典2010 源代码

    热门讨论 2014-04-14 09:57:41
    1.2 WPF:高级API 4 1.2.1 分辨率无关性 5 1.2.2 WPF的演化 9 1.2.3 Windows窗体将继续保留 11 1.2.4 DirectX也将继续保留 12 1.2.5 Silverlight 12 1.3 WPF体系结构 13 1.4 结束语 17 第2章 XAML 19 2.1 ...
  • Web API

    2019-01-08 02:05:17
    一、Wep API 定义 ...新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models、Views、Controllers等文件夹和Global.asax文件。 ASP.NET Web API ASP.NET Web API is a framework that makes it e...
  • Web Api 是什么? MSDN:ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务 百度百科:Web API是网络应用程序接口。 个人理解:Web API 是提供给多种客户端对...
  • 零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了。网上也有很多介绍这方面的文章。我这里提这个是因为接下来我要分享的内容和这个有些关联。 随着前端...
  • Self-Hosting ASP.NET Web APIhttp://theshravan.net/self-hosting-asp-net-web-api/ http://www.piotrwalat.net/hosting-web-api-in-windows-service/ ASP.NET Web API is a framework for building ...
  • 一、摘要 引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们...本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务,如果您对...
  • Asp.net mvc 4中出现的web api是用来实现REST. 关于什么是REST,可以看这里http://zh.wikipedia.org/zh/REST 通过ajax等访问 web api非常方便,但是如何在Winform, Silverlight等访问web api呢? 通过搜索,发现...
  • 寄宿Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台、Windows Forms 应用、WPF 应用甚至是Windows Service)作为宿主。 方法: Nuget上安装Microsoft.AspNet.WebApi....
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    ------WPF开发教程 目录 WPF基础入门.... 3 1. WPF基础之体系结构... 3 2. WPF基础之XAML. 9 3. WPF基础之基元素... 23 4. WPF基础之属性系统... 26 5. WPF基础之路由事件... 33 6. WPF基础之布局系统... ...
  • Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form 、WPF、控制台应用以及Windows Service,寄宿的请求的监听、接收 和响应功能,是通过一个类型为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 811
精华内容 324
关键字:

webapi宿主wpf