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

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

    1. 完整示例演示#
      示例演示
      在这里插入图片描述

    2. 新建解决方案以及 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 服务类#

    /// <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 中使用路由特性.

    1. 调用 HTTP 服务#
      在 MainForm 窗体程序中引用 HTTP 服务:
    public class MainForm:Form
    {
        /// <summary>
        /// Http service.
        /// </summary>
        private HttpService _http;
    }
    

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

    /// <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 服务代码#

    /// <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);
        }
    }
    
    1. 开发控制器#
    /// <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}"});
        }
    }
    
    1. 合在一起#
      解决方案完整结构
      在这里插入图片描述

    下载完整示例代码 (GitHub)
    https://github.com/xixixixixiao/xiao-blog/tree/master/solutions/SelfHostingDemo
    6. 注意事项#
    程序需要拥有 管理员c#教程权限 才能开启 HTTP 监听, 在调试时, 若 Visual Studio 为拥有管理员权限, 则无法正常运行. 同样地, 在程序编译生成之后运行时亦需要权限.

    作者: 芯芊

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

    展开全文
  • 前言 今天研究了在 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

    展开全文
  • 寄宿Web API不一定需要IIS的支持,我们可以采用Self Host的... 对于SelfHost这样一个空的控制台应用来说,除了需要引用WebApi的项目,还需要引用以下程序集  System.Web.Http  System.Web.Http.SelfHost  ...

      寄宿Web API不一定需要IIS的支持,我们可以采用Self Host的方式使用任意类型的应用程序(控制台、Windows Forms应用、WPF)作为宿主。

      对于SelfHost这样一个空的控制台应用来说,除了需要引用WebApi的项目,还需要引用以下程序集

          System.Web.Http

          System.Web.Http.SelfHost

          System.Net.Http

      对于Web Host的方式寄宿Web API需要做的唯一一件事情是路由注册。但是对于Self Host来说,除了必须的路由注册,我们还需要完成额外的一件事,

    即手工加载定义了HttpController类型的程序集。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Http;
    using System.Web.Http.SelfHost;
    
    namespace SeifHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly.Load("WebApi, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null");
    
                HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://localhost/selfhost");
    
                using (HttpSelfHostServer httpServer = new HttpSelfHostServer(configuration))
                {
                    httpServer.Configuration.Routes.MapHttpRoute(
                        name: "DefaultApi",
                        routeTemplate: "api/{controller}/{id}",
                        defaults: new { id = RouteParameter.Optional });
                    httpServer.OpenAsync();
                    Console.WriteLine("我已启动,亲可以在浏览器预览了。");
                    Console.Read();
                }
    
            }
        }
    }

     

    我们启动程序 F5

     

     然后在浏览器输入http://localhost/selfhost/api/Contacts/001

     

     

       ASP.NET Web API的Self Host寄宿方式通过HttpSelfHostServer来完成

     

    转载于:https://www.cnblogs.com/fenger-VIP/p/6678667.html

    展开全文
  • 一、摘要 引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们...本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务,如果您对...

    一、摘要

    引用

    寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台、Windows Forms 应用、WPF 应用甚至是Windows Service)作为宿主。

    本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务,如果您对本期的教程内容感兴趣,那么请允许让阿笨带着大家一起学习吧!

    废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。

    二、概念名称含义解释

    2.1、Host和Self—Host分别是什么意思?

    2.2、OWIN到底是神马东西?

    2.3、基于OWIN规范实现的HTTP服务器有哪些?

    2.4、Owin协议的实现项目?

    四、需求分析

    4.1、上期回顾

    4.2、原理图

    4.3、那么我们今天要解决的问题可以总结为下面的一句话:

    如何让WEB网页端直接以HTTP方式访问本地桌面客户端,就像访问远程IIS上的Web应用程序一样?

    4.4、实现WEB应用程序的Self-Host解决方案

    五、涉及覆盖的知识点

    ASP.NET WebAPI HttpSelfHost/OWIN 如何以桌面应用程序方式,宿主承载WebApi服务;

    ASP.NET WebAPI HttpSelfHost/OWIN 如何让服务端支持CROS跨越访问;

    IE10.0 以下浏览器通过XDomainRequest实现CORS访问;

    六、源码在线解读和演示

    展开全文
  • 引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以采用Self Host ...本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务...
  • 引用寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以...一、摘要本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务,如果您...
  • 寄宿Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台、Windows Forms 应用、WPF 应用甚至是Windows Service)作为宿主。 方法: Nuget上安装Microsoft.AspNet.WebApi....
  • Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form 、WPF、控制台应用以及Windows Service,寄宿的请求的监听、接收 和响应功能,是通过一个类型为...
  • wpf中使用selfhost自宿主方式启动web服务作为服务端,暴露apicontroller,客户端用httpclient,模拟web的get/post请求方式,上传图片和通信。
  • 原理是将Winform或WPF 应用程序,宿主到ASP.NET Core Web API上,具体先来个小视频看看效果,想要代码直接往下面翻: 【视频占位】 实战步骤: 创建一个 WPF 应用程序 添加ASP.NET Core、Serilog支持 WPF窗体中...
  • WPF编程宝典 part1

    2015-07-20 23:33:59
    1.2 WPF:高级API 4 1.3 分辨率无关性 5 1.3.1 WPF单位 6 1.3.2 系统DPI 7 1.3.3 位图和矢量图形 9 1.4 WPF体系结构 10 1.5 WPF 4.5 13 1.5.1 WPF工具包 14 1.5.2 Visual Studio 2012 14 1.6 小结 16 第2章 XAML 17 ...
  • WPF编程宝典 part2

    2015-07-20 23:35:21
    1.2 WPF:高级API 4 1.3 分辨率无关性 5 1.3.1 WPF单位 6 1.3.2 系统DPI 7 1.3.3 位图和矢量图形 9 1.4 WPF体系结构 10 1.5 WPF 4.5 13 1.5.1 WPF工具包 14 1.5.2 Visual Studio 2012 14 1.6 小结 16 第2章 XAML 17 ...
  • WPF编程宝典(101-200页)

    热门讨论 2010-04-25 12:49:35
    1.2 WPF:高级API 1.2.1 分辨率无关性 1.2.2 wPF的演化 1.2.3 WindL0WS窗体将继续保留 1.2.4 Direct)(也将继续保留 1.2.5 Silvcrlight 1.3 WPF体系结构 1.4 结束语 第2章 XAML 2.1 理解XAML 2.1.1 wPF之前的图形...
  • 一款非常好的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 ...
  • 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 理解XAML ...
  • Self-Host

    2017-07-29 16:56:00
    寄宿Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台、Windows Forms 应用、WPF 应用甚至是Windows Service)作为宿主。 方法: Nuget上安装Microsoft.AspNet.WebApi....
  • 介绍了WPF编程,包括样式、数据驱动的应用程序和文档、ASP.NET Web Forms以及ASP.NET MVC 目 录 第Ⅰ部分 C# 语 言 第1章 .NET体系结构 1.1 C#与.NET的关系 1.2 公共语言运行库 1.2.1 平台无关性 1.2.2 提高性能 ...
  • asp.net知识库

    2015-06-18 08:45:45
    使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf部署 ASP.NET 2.0 Security FAQs Asp.net 2.0功能体验,细节之Web控件(一) 隐藏控件 Asp.net 2.0功能体验,总体设计思想 Asp...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

webapi宿主wpf