webapi寄宿在winform上_webapi 寄宿 winform - CSDN
精华内容
参与话题
  • WebApi的几种寄宿方式

    千次阅读 2015-07-18 00:57:02
    ASP.NET Web API具有与ASP.NET MVC类似的编程方式,相关内容较少,如下通过一个实例讲解WebApi的集中寄宿方式。  目录  构建解决方案  定义Web API  以Web Host方式寄宿Web API  以Self Host方式寄宿Web...

          ASP.NET Web API具有与ASP.NET MVC类似的编程方式,相关内容较少,如下通过一个实例讲解WebApi的集中寄宿方式。 

    目录 
    构建解决方案 
    定义Web API 
    以Web Host方式寄宿Web API 
    以Self Host方式寄宿Web API 
    利用HttpClient调用Web API 
    创建一个“联系人管理器”应用

    一、构建解决方案

    Visual Studio为我们提供了专门用于创建ASP.NET Web API应用的项目模板,借助于此项目模板提供的向导,我们可以“一键式”创建一个完整的ASP.NET Web API项目。在项目创建过程中,Visual Studio会自动为我们添加必要的程序集引用和配置,甚至会为我们自动生成相关的代码,总之一句话:这种通过向导生成的项目在被创建之后其本身就是一个可执行的应用。

    对于IDE提供的这种旨在提高生产效率的自动化机制,我个人自然是推崇的,但是我更推荐读者朋友们去了解一下这些自动化机制具体为我们做了什么?做这些的目的何在?哪些是必需的,哪些又是不必要的?正是基于这样的目的,在接下来演示的实例中,我们将摒弃Visual Studio为我们提供的向导,完全在创建的空项目中编写我们的程序。这些空项目体现在如右图所示的解决方案结构中。

    如右图所示,整个解决方案一共包含6个项目,上面介绍的作为“联系人管理器”的单页Web应用对应着项目WebApp,下面的列表给出了包括它在内的所有项目的类型和扮演的角色。

    • ·Common:这是一个空的类库项目,仅仅定义了表示联系人的数据类型而已。之所以将数据类型定义在独立的项目中,只要是考虑到它会被多个项目(WebApi和ConsoleApp)所使用。
    • WebApi:这是一个空的类库项目,表现为HttpController类型的Web API就定义在此项目中,它具有对Common的项目引用。
    • WebHost:这是一个空的ASP.NET Web应用,它实现了针对ASP.NET Web API的Web Host寄宿,该项目具有针对WebApi的项目引用。
    • SelfHost:这是一个空的控制台应用,旨在模拟ASP.NET Web API的Self Host寄宿模式,它同样具有针对WebApi的项目引用。
    • WebApp:这是一个空的ASP.NET Web应用,代表“联系人管理器”的网页就存在于该项目之中,至于具体的联系人管理功能,自然通过以Ajax的形式调用Web API来完成。
    • ConsoleApp:这是一个空的控制台应用,我们用它来模拟如何利用客户端代理来实现对Web API的远程调用,它具有针对Common的项目引用。

    二、定义Web API

    在正式定义Web API之前,我们需要在项目Common中定义代表联系人的数据类型Contact。简单起见,我们仅仅为Contact定义了如下几个简单的属性,它们分别代表联系人的ID、姓名、联系电话、电子邮箱和联系地址。

       1: public class Contact
       2: {
       3:     public string Id { get; set; }
       4:     public string Name { get; set; }
       5:     public string PhoneNo { get; set; }
       6:     public string EmailAddress { get; set; }
       7:     public string Address { get; set; }
       8: }

    表现为HttpController的Web API定义在WebApi项目之中,我们一般将ApiController作为继承的基类。ApiController定义在“System.Web.Http.dll”程序集中,我们可以在目录“%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\”中找到这个程序集。具体来说,该程序集存在于子目录“Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45”中。

    Web API体现在如下所示的ContactsController类型中。在该类型中,我们定义了Get、Post、Put和Delete这4个Action方法,它们分别实现了针对联系人的查询、添加、修改和删除操作。Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。由于ASP.NET Web API默认实现了Action方法与HTTP方法的映射,所以方法名也体现了它们各自所能处理请求必须采用的HTTP方法。

       1: public class ContactsController: ApiController
       2: {
       3:     static List<Contact> contacts;
       4: static int counter = 2;
       5:  
       6:     static ContactsController()
       7:     {
       8:         contacts = new List<Contact>();
       9:         contacts.Add(new Contact { Id = "001", Name = "张三", 
      10:             PhoneNo = "0512-12345678", EmailAddress = "zhangsan@gmail.com", 
      11:             Address = "江苏省苏州市星湖街328号" });
      12:         contacts.Add(new Contact { Id = "002", Name = "李四", 
      13:             PhoneNo = "0512-23456789", EmailAddress = "lisi@gmail.com", 
      14:             Address = "江苏省苏州市金鸡湖大道328号" });
      15: }
      16:  
      17:     public IEnumerable<Contact> Get(string id = null)
      18:     {
      19:         return from contact in contacts
      20:             where contact.Id == id || string.IsNullOrEmpty(id)
      21:             select contact;
      22: }
      23:  
      24:     public void Post(Contact contact)
      25:     {
      26:         Interlocked.Increment(ref counter);
      27:         contact.Id = counter.ToString("D3");
      28:         contacts.Add(contact);
      29:     }
      30:  
      31:     public void Put(Contact contact)
      32:     {
      33:         contacts.Remove(contacts.First(c => c.Id == contact.Id));
      34:         contacts.Add(contact);
      35:     }
      36:  
      37:     public void Delete(string id)
      38:     {
      39:         contacts.Remove(contacts.First(c => c.Id == id));        
      40:     }
      41: }

    简单起见,我们利用一个静态字段(contacts)表示存储的联系人列表。当ContactsController类型被加载的时候,我们添加了两个ID分别为“001”和“002”的联系人记录。至于实现联系人CRUD操作的Action方法,我们也省略了必要的验证,对于本书后续的演示的实例,我们基本上也会采用这种“简写”的风格。

    三、以Web Host方式寄宿Web API

    我们在上面已经提到过了,虽然被命名为ASP.NET Web API,但是其核心的消息处理管道却是独立于ASP.NET平台的,所以我们可以对相同的Web API实施不同的寄宿方式。寄宿的本质就是利用一个具体的应用程序为Web API提供一个运行的环境,并最终解决“请求的接收和响应的回复”问题。作为寄宿的一种主要形式,Web Host就是创建一个ASP.NET Web应用作为Web API的宿主。

    采用Web Host方式寄宿Web API的宿主程序WebHost是一个空的ASP.NET应用。除了让它引用定义ContactsController的WebApi项目之外,我们还需要为其添加如下这些必需的程序集引用。除了程序集“System.Net.Http.dll”(它属于.NET Framework 原生的程序集)之外,其余3个均可以在目录“%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\”中找到。

    • System.Web.Http.dll(\ Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\)
    • System.Net.Formatting.Http.dll(\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\)
    • System.Web.Http.WebHost.dll(\Microsoft.AspNet.WebApi.WebHost.5.0.0\lib\net45\)
    • System.Net.Http.dll

    与ASP.NET MVC一样,如果采用Web Host的方式来寄宿Web API,ASP.NET自身的路由系统会成为接收请求的第一道屏障。在将请求递交给ASP.NET Web API自己的消息处理管道之前,路由系统会解析出当前请求访问的目标HttpController和Action的名称。我们需要做的就是根据需求注册相应的路由,这也是采用Web Host寄宿方式所需的唯一操作。

    我们在WebHost项目中添加一个Global.asax文件,并按照如下的形式在其Application_Start方法中注册了一个模板为“api/{controller}/{id}”的路由。此模板由3部分组成,静态文本“api”表示其前缀,后面是两个路由参数。前者({controller})表示目标HttpController的名称,后者({id})可以映射为目标Action方法的同名参数(比如ContractsController的Get方法的参数id),这是一个可以缺省的路由参数(RouteParameter.Optional)。

       1: public class Global : System.Web.HttpApplication
       2: {
       3:     protected void Application_Start(object sender, EventArgs e)
       4:     {
       5:         GlobalConfiguration.Configuration.Routes.MapHttpRoute(
       6:             Name            : "DefaultApi",
       7:             routeTemplate   : "api/{controller}/{id}",
       8:             defaults        : new { id = RouteParameter.Optional });
       9:     }
      10: }

    如上面的代码片断所示,路由注册是通过调用代表全局路由表的HttpRouteCollection对象的扩展方法MapHttpRoute来完成的。GlobalConfiguration的静态属性Configuration返回一个代表当前配置的HttpConfiguration对象,全局路由表就注册在它的Routes属性上。

    如果你了解ASP.NET MVC的路由注册,可能觉得奇怪:注册路由的模板中并没有表示目标Action的路由参数,ASP .NET Web API如何根据请求确定哪个Action方法应该被调用呢?答案其实很简单:它能根据请求采用HTTP方法来确定目标Action方法。当然,在注册路由模板中提供代表Action名称的路由参数({action})也是支持的。

    在默认情况下,通过Visual Studio(VS 2012或者VS 2013,本书采用的是后者)创建的Web应用总是使用IIS Express作为服务器,它会自动为我们指定一个可用的端口号。为了更好地模拟真实发布环境,同时避免“跨域资源共享”带来的困扰,我们采用本地IIS作为服务器。如下图所示,WebHost项目在IIS中映射的Web应用采用的URL为“http://localhost/webhost”。

    实际上到此为止,Web API的Web Host寄宿工作就已经完成,我们可以利用浏览器来调用寄宿的Web API来判断寄宿工作是否成功。由于浏览器在默认情况下访问我们在地址栏中输入的地址总是采用HTTP-GET请求,所以我们只能利用它来调用支持HTTP-GET的Action方法,即定义在ContactsController中的Get方法。

    根据我们注册的路由,如果我们访问目标地址“http://localhost/webhost/api/contacts”可以获得所有联系人列表;如果目标地址为“http://localhost/webhost/api/contacts/001”,则可以得到ID为“001”的联系人信息,右图证实了这一点。

    从右图可以看到,我们采用的浏览器为Chrome,获取的联系人列表总是表示为XML,这是为什么呢?在前面介绍REST的时候,我们曾经提及一种旨在识别客户端期望的资源表示形式并被称为“内容协商”的机制,它可以根据请求携带的相关信息来判断客户端所期望的响应资源表现形式。

    对于ASP.NET Web API来说,它会优先利用请求报头“Accept”携带的媒体类型来确定响应内容采用的表现形式。如下所示的是Chrome访问“http://localhost/webhost/api/contacts/001”发送请求的内容,它之所以会得到以XML表示的响应是因为“Accept”报头指定的媒体类型列表中只有“application/xml”被ASP.NET Web API支持。如果我们采用IE,请求的“Accept”报头将携带不同的媒体类型列表,我们实际上会得到以JSON格式表示的响应结果。

       1: GET http://localhost/webhost/api/contacts/001 HTTP/1.1
       2: Host: localhost
       3: Connection: keep-alive
       4: Cache-Control: max-age=0
       5: Accept: text/html,application/xhtml+xml,application/xml ;q=0.9,image/webp,*/*;q=0.8
       6: User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
       7: Accept-Encoding: gzip,deflate,sdch
       8: Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh-TW;q=0.4

    为了进一步验证并演示ASP.NET Web API的内容协商机制,我们现在改用Fiddler来发送调用Web API的HTTP请求。如左图所示,我们利用Fiddler发送了一个针对目标地址“http://localhost/webhost/api/contacts/001”的HTTP-GET请求,并添加了一个值为“application/json”的“Accept”报头,请求发送之后确实得到了以JSON格式表示的联系人列表。

    支持PUT和DELETE请求

    在定义ContactsController的时候,我们严格按照RESTful Web API关于“使用标准的HTTP方法”的指导方针,分别采用GET、POST、PUT和DELETE作为获取、创建、修改和删除联系人的操作所支持的HTTP方法。但是IIS在默认情况下并不提供针对 PUT和DELETE请求的支持。

    如右图所示,我们利用Fiddler发送了一个针对地址“http://localhost/webhost/api/contacts/001”的HTTP-DELETE请求,旨在删除ID为“001”的联系人。但是遗憾的是,我们得到了一个状态为“405,Method Not Allowed”的响应,意味着服务端并不支持HTTP-DELETE方法。

    IIS拒绝PUT和DELETE请求是由默认注册的一个名为“WebDAVModule”的自定义HttpModule导致的。WebDAV的全称为“Web-based Distributed Authoring and Versioning”,它是一个在多用户之间辅助协同编辑和管理在线文档的HTTP扩展。该扩展使应用程序可以直接将文件写到 Web Server 上,同时支持文件的加锁和版本控制。

    微软是推动WebDAV成为一个标准的主导力量,它自己利用自定义的HttpModule实现了IIS针对WebDAV的支持。但是这个默认注册(注册名称为“WebDAVModule”)会拒绝HTTP方法为PUT和DELETE的请求,如果我们的站点不需要提供针对WebDAV的支持,解决这个问题最为直接的方式就是利用如下的配置将注册的HttpModule移除。

       1: <configuration>
       2:   ...
       3:   <system.webServer>
       4:     <modules runAllManagedModulesForAllRequests="true">
       5:       <remove name="WebDAVModule" />
       6:     </modules>
       7:   </system.webServer>
       8: </configuration>

     

    四、 以Self Host方式寄宿Web API

    与WCF类似,寄宿Web API不一定需要IIS的支持,我们可以采用Self Host的方式使用任意类型的应用程序(控制台、Windows Forms应用、WPF应用甚至是Windows Service)作为宿主。对于我们演示的实例来说,项目SelfHost代表的控制台程序就是一个采用Self Host寄宿模式的宿主。

    对于SelfHost这么一个空的控制台应用来说,除了需要添加针对WebApi的项目引用之外,还需要添加如下4个程序集引用。除了程序集“System.Net.Http.dll”(它属于.NET Framework 原生的程序集)之外,其余3个均可以在目录“%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\”中找到。

    • System.Web.Http.dll(\ Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45\)
    • System.Net.Formatting.Http.dll(\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\)
    • System.Web.Http.SelfHost.dll(\Microsoft.AspNet.WebApi.SelfHost.5.0.0\lib\net45\)
    • System.Net.Http.dll

    通过上面的介绍我们可以看到以Web Host的方式寄宿Web API需要做的唯一一件事情是路由注册。但是对于Self Host来说,除了必需的路由注册外,我们还需要完成额外的一件事情,即手工加载定义了HttpController类型的程序集。整个寄宿工作通过如下几行简单的代码就可以实现。

       1: class Program
       2: {
       3:     static void Main(string[] args)
       4:     {
       5:         Assembly.Load("WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
       6:             
       7:         HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://localhost/selfhost");
       8:         using (HttpSelfHostServer httpServer = new HttpSelfHostServer(configuration))
       9:         {
      10:             httpServer.Configuration.Routes.MapHttpRoute(
      11:                 name            : "DefaultApi",
      12:                 routeTemplate   : "api/{controller}/{id}",
      13:                 defaults        : new { id = RouteParameter.Optional });
      14:  
      15:             httpServer.OpenAsync();
      16:             Console.Read();
      17:         }
      18:     }
      19: }

    ASP.NET Web API的Self Host寄宿方式通过HttpSelfHostServer来完成。如上面的代码片断所示,在手工加载了定义ContactsController类型的程序集“WebApi.dll”之后,我们根据指定的基地址(“http://localhost/selfhost”),注册路由的URL模板将是以此作为基地址的相对地址)创建了一个HttpSelfHostConfiguration对象,HttpSelfHostServer由该对象创建。接下来,我们利用创建的HttpSelfHostConfiguration对象(对应着HttpSelfHostServer的Configuration属性)的Routes得到全局路由表,并调用扩展方法MapHttpRoute注册了与Web Host寄宿方式一样的路由。当我们调用OpenAsync方法成功开启HttpSelfHostServer之后,服务器开始监听来自网络的调用请求。

    如果读者朋友们对WCF比较熟悉的话,应该清楚在进行WCF服务寄宿的时候我们必须指定寄宿服务的类型,但是对于ASP.NET Web API的寄宿来说,不论是Web Host还是Self Host,我们都无需指定HttpController的类型。换句话说,WCF服务寄宿是针对具体某个服务类型的,而ASP.NET Web API的寄宿则是批量进行的。

    ASP.NET Web API的批量寄宿源自它对HttpController类型的智能解析,它会从“提供的”的程序集列表中解析出所有HttpController类型(所有实现了IHttpController接口的类型)。对于Web Host来说,它会利用BuildManager获得当前项目直接或者间接引用的程序集,但是对于Self Host来说,HttpController类型的解析在默认情况下只会针对加载到当前应用程序域中的程序集列表,这也是我们为何需要手工加载定义了ContactsController类型的程序集的原因所在。

    如果现在运行这个作为宿主的控制台程序,我们依然可以对寄宿其中的Web API发起调用。同样采用浏览器作为测试工具,在分别访问目标地址“http://localhost/selfhost/api/contacts”和“http://localhost/selfhost/api/contacts/001”后,我们依然会得到上面的结果。


    参考:http://www.cnblogs.com/artech/p/web-api-sample.html

    展开全文
  • c# WebApi Winform托管

    2020-07-30 23:33:25
    这是一个WebApi在Winform项目的托管示例。 展示了子线程访问ui。
  • winform寄宿 WebApi

    千次阅读 2019-06-17 14:28:45
    winform寄宿webapi在winform中添加如下: Thread td = new Thread(new ThreadStart( () => { try { ...

     winform中寄宿webapi,在winform中添加如下:

                Thread td = new Thread(new ThreadStart(
                    () =>
                    {
                        try
                        {
                            Assembly.Load("WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
                            HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://localhost/selfhost");
                            configuration.TransferMode = TransferMode.Streamed;
                           
                            HttpSelfHostServer httpServer = new HttpSelfHostServer(configuration);
                            
                                httpServer.Configuration.Routes.MapHttpRoute(
                                    name: "DefaultApi",
                                    routeTemplate: "api/{controller}/{id}",
                                    defaults: new { id = RouteParameter.Optional });
    
                                httpServer.OpenAsync().Wait();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                 ));
                td.IsBackground = true;
                Console.WriteLine(td.IsBackground);
                td.Start();
    展开全文
  • winform宿主webapi

    千次阅读 2019-05-16 20:19:07
    引用的Dll 添加配置文件packages.config <?xml version="1.0" encoding="utf-8"?...package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net461" /> <p...

    引用的Dll

    添加配置文件packages.config

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net461" />
      <package id="Microsoft.AspNet.WebApi.Core" version="5.2.6" targetFramework="net461" />
      <package id="Microsoft.AspNet.WebApi.SelfHost" version="5.2.6" targetFramework="net461" />
      <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net461" />
    </packages>

    新建Controller文件夹里面的ValuesConntroller.cs类

     [RoutePrefix("api/values")]
        public class ValuesController : ApiController
        {
            [HttpGet]
            [Route("st")]
            public string GetServerTim(string id)
            {
                try
                {
                    string result = Program.FormCheck.GetJsonById(id);
    
                    return result;
                }
                catch
                {
                    return "failed :"+ id;
                }
            }
            protected HttpRequestBase GetRequest()
            {
                HttpContextBase context = (HttpContextBase)Request.Properties["MS_RequestContext"];//获取传统context
    
                HttpRequestBase request = context.Request;//定义传统request对象
    
                return request;
            }
            private string GetClientIp(HttpRequestMessage request = null)
            {
                request = request ?? Request;
    
                if (request.Properties.ContainsKey("MS_HttpContext"))
                {
                    return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
                }
                else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
                {
                    RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
                    return string.Format("Address:{0}, Port: {1}", prop.Address, prop.Port.ToString());
                }
                else if (HttpContext.Current != null)
                {
                    return HttpContext.Current.Request.UserHostAddress;
                }
                else
                {
                    return null;
                }
            }
        }

    Program类中这样写

     public static class Program
        {
            public static CheckInterface FormCheck = null;
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                FormCheck = new CheckInterface();
                Application.Run(FormCheck);
            }
        }

    Form中这样写

      HttpSelfHostConfiguration config = null;
            HttpSelfHostServer server = null;
          
            public CheckInterface()
            {
                InitializeComponent();
                renderDgv_Interface.AllowUserToAddRows = false;
            }
    
            private void CheckInterface_Load(object sender, EventArgs e)
            {
                RefreshWebApi();
            }
            private void RefreshWebApi()
            {
                config = new HttpSelfHostConfiguration(Url);// "http://192.168.0.163:8085");
                config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
                server = new HttpSelfHostServer(config);
                server.OpenAsync().Wait();
            }

    启动之后浏览器访问http://192.168.0.163:8085/api/values?id=001即可看到weiapi接口已经成功在Winform上运行。

    如果想要访问Webapi执行方法与WinformUI界面交互,用委托另外还要判断几个属性

     

      delegate void DAddRdgvData(List<JsonData> DataSourse);
    
            private void AddRdgvData(List<JsonData> DataSourse)
            {
                if (renderDgv_Interface.InvokeRequired)
                {
                    while (!this.renderDgv_Interface.IsHandleCreated)
                    {
                        if (this.renderDgv_Interface.Disposing || this.renderDgv_Interface.IsDisposed)
                            return;
                    }
                    DAddRdgvData d = new DAddRdgvData(AddRdgvData);
                    this.renderDgv_Interface.Invoke(d, new object[] { DataSourse });
                }
                else
                {
    
                    for (int i = 0; i < DataSourse.Count; i++)
                    {
                        if (ListId.Contains(DataSourse[i].Id))
                        {
                            for (int j = 0; j < renderDgv_Interface.RowCount; j++)
                            {
                                if (renderDgv_Interface.Rows[j].Cells["rdgv_Interface_id"].Value != null)
                                {
    
                                    if (DataSourse[i].Id.Equals(renderDgv_Interface.Rows[j].Cells["rdgv_Interface_id"].Value.ToString()))
                                    {
                                        renderDgv_Interface.Rows[j].Cells["rdgv_Name"].Value = DataSourse[i].Name;
                                        renderDgv_Interface.Rows[j].Cells["rdgv_Time"].Value = DataSourse[i].Time;
                                        renderDgv_Interface.Rows[j].Cells["Rdgv_NumberTimes"].Value = DataSourse[i].Numberoftimes;
                                        renderDgv_Interface.Rows[j].Cells["rdgv_Return"].Value = DataSourse[i].CheckResult;
                                    }
    
                                }
                            }
                        }
                        else
                        {
                           //这里向控件传数据
                        }
                    }
                }
            }

    展开全文
  • WebApi自宿主应用

    千次阅读 2013-12-02 09:45:59
     WebAPI 托管有两种方式一种是通过IIS,一种就是通过寄宿在其他程序,例如window服务,window应用程序等等,前者主要用于发布和最后调试使用,后者一般多开发测试环节。  我们知道WCF服务可以通过System

    WebApi 自宿主一例,关于Web Api的基础入门和相关概念可以参考

    官方入门教程

    CodeProject入门例子

     

    1. 简介

      WebAPI 托管有两种方式一种是通过IIS,一种就是通过寄宿在其他程序,例如window服务,window应用程序等等,前者主要用于发布和最后调试使用,后者一般多在开发测试环节。

      我们知道WCF服务可以通过System.ServiceModel.ServiceHost来加载和打开服务,那么web api可以通过System.Web.Http.SelfHost.HttpSelfHostServer来加载打开API服务

      在使用System.Web.Http.SelfHost.HttpSelfHostServer来打开服务的时候,需要通过HttpSelfHostConfiguration来配置下主机一些参数(主要是服务地址)

    2.实例

     1) 通过VS2012新建一个window form工程,然后通过Nuget获取WebAPI SeltHost库,下载安装后的包:

       

        引用命名空间:

    using System.Web.Http;
    using System.Web.Http.SelfHost;  

      声明变量:主机服务和配置实例对象 

     

    private HttpSelfHostConfiguration _config = null;
    private HttpSelfHostServer _serverhost = null;

    初始化:

     

    _config = new HttpSelfHostConfiguration("http://localhost:5555");

    API路由 +打开服务

    复制代码
                _config.Routes.MapHttpRoute(
                    "API Default",
                    "api/{controller}/{username}",
                    new { username = RouteParameter.Optional });
    
                //start 
                _serverhost = new HttpSelfHostServer(_config);
                _serverhost.OpenAsync().Wait();
    复制代码

    模型类:

    复制代码
        public class UserModel {
            [Required]
            [StringLength(16,MinimumLength=4)]
            public string UserName { get; set; }
    
            [Required]
            [StringLength(16,MinimumLength=4)]
            public string Password { get; set; }
    
            [Required]
            [RegularExpression(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")]
            public string Email { get; set; }
    
            [Required]
            [Range(18,36)]
            public int Age { get; set; }
    
        }
    复制代码

     接下来我们需要设计一个测试客户端来验证我们的API

     

    2) 新建一个window form工程,依旧是通过NuGet获取WebAPI Client库(用于桌面客户端程序请求API服务)

     声明一个HttpClient对象,并初始化API服务地址

     

    private HttpClient _httpCLient = new HttpClient();
    _httpCLient.BaseAddress =new Uri( @"http://localhost:5555");

    调用

    复制代码
            private void GetUsers() {
                HttpResponseMessage responseMsg = _httpCLient.GetAsync("api/user").Result;
                responseMsg.EnsureSuccessStatusCode();
                var users = responseMsg.Content.ReadAsAsync<IEnumerable<UserModel>>().Result;
                string msg = string.Empty;
                foreach (var o in users) {
                    msg += string.Format("Name:{0} , Email:{1} , Age:{2}", o.UserName, o.Email, o.Age);
                    msg += System.Environment.NewLine;
                }
    
                MessageBox.Show(msg);
            }
    复制代码

     

    程序运行效果图:

    点击initConfig(配置/打开服务) ---- 》 点击Get( 测api/User,获取所有用户信息)

     

    源码下载 ,工程基于VS2012,NET FROMWORK4.5

    展开全文
  • 创建一个寄宿于控制台程序的WebAPi

    千次阅读 2016-02-22 15:05:07
    由于项目需要创建一个寄宿于控制台程序的WebAPI,看了一通资料,终于完成了,下面记录一下过程,备忘吧。 如果需要补充asp.net webApi的基础知识请查看微软官方知识网站:...
  • .Net Core 项目Windows服务中托管

    千次阅读 2018-08-18 13:24:51
    本文以创建的WebAPI项目为例子进行讲解(本人使用VS Code创建的项目) 1、使用VS Code创建WebAPI项目(项目名称自定义) 2、创建的项目csproj项目文件中,确认是否存在运行时标识符,或将其添加到包含目标框架的...
  • webapi寄宿winform

    2020-03-27 23:33:11
    webapi寄宿winform的实现,无须配置IIS,设置简单方便,.net4.5.2,可以扩展使用
  • DotNET技術

    千次阅读 2013-04-06 13:59:27
    【C#利用后台动态加载数据】Winform“防界面卡死” 从数据到代码——基于T4的代码生成方式 从数据到代码——通过代码生成机制实现强类型编程[篇] 从数据到代码——通过代码生成机制实现强类型编程[下篇] 创建...
  • C# 第三方类库使用目录

    千次阅读 2017-06-08 16:10:49
    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续...
  • C# WebAPI 集成WINDOWS验证

    千次阅读 2018-12-13 20:45:33
    首先在WEB.CONFIG文件中,增加如下配置,以开启WINDOWS身份验证,配置...然后需要认证授权后才能访问的Controller中类或ACTION方法添加Authorize特性,Controller与上文相同不再贴出,当然也可以在WEB.CONFIG...
  • 解决WCF寄宿WINFORM的跨域请求问题

    千次阅读 2018-05-02 10:05:17
    本人项目中遇到的问题是这样的:WCF服务寄宿于Winfrom应用程序,通过public ServiceHost host = new ServiceHost(typeof(ByuWCFService.ByuDataService));host.Open();的方式来开启WCF服务,[OperationContract]...
  • .NET方面的框架的整理和总结

    千次阅读 2018-05-20 23:48:35
    引用 http://www.cnblogs.com/LowKeyCXY/p/8005247.html自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,工作和学习中也积累了一些...
  • WCF(一) Windows Communication Foundation 概述 WCF被推出来很久了,但是对于刚刚接触WCF的...以上这些问题的答案网上已经很多介绍了,我此本不必再浪费口舌,只是大概提一下。 WCF: Windows Communication Fo
  • c# host web服务器

    千次阅读 2014-10-20 17:33:42
    No,虽然那个也是服务器,但是我们今天要说的Web服务器主要是指像IIS这样一类的,用于处理request并返回response的工具,没错我们可以说它是一个工具,不就是一个应用程序吗?谁不会写应用程序呀,等着,三分钟就搞...
  • Windows Workflow技术

    千次阅读 2007-05-16 10:04:00
    Windows Workflow技术 1 概念... 22 Windows Workflow.. 42.1 .Net Framework 3.0 简介... 42.2 Windows Workflow Foundation简介... 53 开发环境搭建... 54 Workflow模型... 64.1 
  • 为了封装一个聊天模块,这些天真是绞尽脑汁,不过也有很多收获,比如下面这个自托管的最简配置,不仅内置了signalr服务,还内置了webapi服务,静态资源文件服务。为了分享这份喜悦,直接代码首先是托管应用start类...
  • 本文将从往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包括:CLS、CTS(CLI)、FCL、Windows下CLR的相关核心组成、Windows...
  • 文章是原作者一字一字亲手码出来的,每天下班用休息时间写一点,持续了二十来天。且对于文章上下衔接、概念引入花了很多心思,致力让很多概念本文中显得通俗。
  • 本文将从往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包括:CLS、CTS(CLI)、FCL、Windows下CLR的相关核心组成、Windows...
1 2 3 4 5 ... 8
收藏数 147
精华内容 58
关键字:

webapi寄宿在winform上