http://www.piotrwalat.net/hosting-web-api-in-windows-service/

ASP.NET Web API is a framework for building HTTP services that can reach a broad range of clients including browsers, phones and tablets. ASP.NET Web API ships with ASP.NET MVC 4 and is part of the Microsoft web platform.

You can read more about Web API in my earlier article @ http://theshravan.net/say-hello-to-asp-net-web-api/

As I mentioned earlier ASP.NET Web API ships with ASP.NET MVC 4. But we are not limited to hosting Web APIs in IIS. ASP.NET Web API gives you the flexibility to host your Web APIs anywhere you would like, including self-hosting in our own process (e.g.: Wpf Application , Console Application, etc…).

In this article I am going explain how to Self-Host Web API in a Console Application and consume from a client application. Same code we can use for Self-Host Web API  in any our own process (any application).

To self-host a Web API first we need to setup server configuration, Here are the steps for server configuration:

    1. Specify the base address for your HTTP server (using HttpSelfHostConfiguration class)
    2. Configure Http routes for your web APIs

Configuring routes is same as using ASP.NET Routing, But only thing is the routes need to be added to the route collection on ourHttpSelfHostConfiguration instance created in first step.

I am creating a Console Application using Visual Studio. Let’s have a look at project structure in solution explorer.

This is plain vanilla Console Application , We need  following important assemblies to work with Web API.

  • System.Web.Http.dll
    • The core runtime assembly for ASP.NET Web API
  • System.Net.Http.dll
    • Provides a programming interface for modern HTTP applications. This includes HttpClient for sending requests over HTTP, as well as HttpRequestMessage and HttpResponseMessage for processing HTTP messages
  • System.Net.Http.WebRequest.dll
    • Provides additional classes for programming HTTP applications
  • System.Web.Http.SelfHost.dll
    • Contains everything you need to host ASP.NET Web API within your own process (outside of IIS)
  • System.Net.Http.Formatting.dll
    • Adds support for formatting and content negotiation to System.Net.Http. It includes support for JSON, XML, and form URL encoded data
  • Newtonsoft.Json.dll
    • Dependent library for System.Net.Http.Formatting.dll to include support for JSON

I grabbed all the above assemblies & add to my project using nuget.

I am creating my Web API controller under Api folder in project (you can place it any where in the project).

using System.Web.Http;  namespace WebAPISelfHostSample.Api {     public class HelloWorldController : ApiController     {         public string Get()         {             return "Hi!, Self-Hosted Web Api Application Get()";         }          public string Get(int id)         {             return "Hi!, Self-Hosted Web Api Application Get() With Id: " + id;         }     } }

Let’s write code in  Program .cs for creating Self-Hosting Web API.

using System; using System.Web.Http; using System.Web.Http.SelfHost;  namespace WebAPISelfHostSample {     class Program     {         static void Main(string[] args)         {             var baseAddress = "http://localhost:8080/";             var config = new HttpSelfHostConfiguration(baseAddress);              config.Routes.MapHttpRoute(                                 name : "DefaultApi",                                 routeTemplate : "api/{controller}/{id}",                                 defaults : new { id = RouteParameter.Optional });              Console.WriteLine("Instantiating The Server...");             using (var server = new HttpSelfHostServer(config))             {                    server.OpenAsync().Wait();                 Console.WriteLine("Server is Running Now... @ " + baseAddress);                 Console.ReadLine();             }         }     } }

Now Build & Run the Application (Hit F5 – Make sure Visual Studio is running under Administrator , other we will get an exception).

We are Successfully Self-Hosted the  Hello World Web Api & The Server is up & running now.

Let’s create client to test this, here is the client code:

using System; using System.Net.Http;  namespace SelfHostWebApiClient {     class Program     {         static void Main(string[] args)         {             var baseAddress = "http://localhost:8080/";              var client = new HttpClient { BaseAddress = new Uri(baseAddress) };              Console.WriteLine("Client received: {0}", client.GetStringAsync("api/helloworld").Result);             Console.WriteLine("Client received: {0}", client.GetStringAsync("api/helloworld/10").Result);              Console.ReadLine();         }     } }

Result:

We are successfully able to access Self-Hosted Web Api from our client application. We can Self Host any complex Web API.

--------------------------------寄宿windowns 服务------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Reflection;
using System.IO;

using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Dispatcher;
using System.Web.Http.SelfHost;

namespace WebAPISelfHost
{
public partial class Service1 : ServiceBase
{
static HttpSelfHostServer CreateHost(string address)
{
// Create normal config
HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(address);

config.Routes.MapHttpRoute(
name: "default",
routeTemplate: "api/{controller}/{id}",
defaults: new { controller = "Home", id = RouteParameter.Optional });

HttpSelfHostServer server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();

return server;
}

public Service1()
{
InitializeComponent();

}

protected override void OnStart(string[] args)
{
HttpSelfHostServer server = CreateHost("http://localhost:8080");
}

protected override void OnStop()
{
}
}

asp.net web api的自托管模式HttpSelfHostServer可以以控制台程序或windows服务程序为宿主,不单单依赖于IIS web服务器的更多相关文章

  1. C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

    在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基 ...

  2. ASP.NET WEB API的服务托管(Self-HOST)

    如果我们想对外发布RESTful API,可以基于ASP.NET来构建Restful APIs,但需要部署IIS吗?答案是不必.你可以把它托管到一个Windows Service.具体如何把WEB A ...

  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在上一篇中,我们已经初步开始使用Web Api了,但同时出现了一些很多不足之处,本章我们就着 ...

  4. 集成架构:对比 Web API 与面向服务的架构和企业应用程序集成(转)

    http://kb.cnblogs.com/page/521644/ 摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不 ...

  5. (转)集成架构:对比 Web API 与面向服务的架构和企业应用程序集成

    摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不同,以及如何将它们融入到一个不断演变的集成架构中.文中还将讨论 API ...

  6. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  7. Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

    构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...

  8. ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道

    Web Host 模式下的路由本质上还是通过ASP.NET 路由系统来进行路由的,只是通过继承和组合的方式对ASP.NET路由系统的内部的类进行了一些封装,产生自己专用一套类结构,功能逻辑基本都是一样 ...

  9. 2.3属性在 ASP.NET Web API 2 路由

    路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...

随机推荐

  1. Redis 3.0集群 Window搭建方案

    Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...

  2. execute immediate的简单用法(oracle)

    直接上示例代码: create or replace procedure proc_test( --参数区域 ) is --变量区域 --sql脚本 v_sql ) :=''; --记录学生数量 v_ ...

  3. 利用Inotify和Rsync将webproject文件自己主动同步到多台应用server

    背景:须要搭建一套跟线上一模一样的环境,用来预公布,这是当中的web分发的一个小模块的实现过程. 1 工具以及环境简单介绍 1.1,Inotify工具 Inotify,它是一个内核用于通知用户空间程序 ...

  4. [Python笔记][第一章Python基础]

    2016/1/27学习内容 第一章 Python基础 Python内置函数 见Python内置函数.md del命令 显式删除操作,列表中也可以使用. 基本输入输出 input() 读入进来永远是字符 ...

  5. 【考虑周全+数学变形】【11月赛】Is it a fantastic matrix?

    Is it a fantastic matrix? Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/ ...

  6. NET基础课--JIT编译器如何工作1

    1..Net运行时调用JIT编译器,用来把由C#编译器生成的IL指令编译成机器代码.这一任务在应用程序的运行期间是分步进行的.JIT并不是在程序一开始就编译整个应用程序,取而代之的是,CLR是一个函数 ...

  7. Android 学习笔记(一)

    环境配置在网上搜索的一大堆. 这里简单发几个连接. http://jingyan.baidu.com/article/bea41d437a41b6b4c51be6c1.html http://jing ...

  8. python-整理--使用IDE

    如何使用python的IDE 安装好python3.4之后,默认有一个叫IDLE,就是目录lib/idlelib之下,是一个简单实用的工具. 在VS2013上安装一个插件就可以使用VS当IDE了.插件 ...

  9. git基础命令

     git pull 更新git status 查看文件状态git add .添加所有git commit -a -m "xxxx" 提交git push 推送至服务器git dif ...

  10. drupal7创始人root忘记密码的解决办法

    在index.php中的drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);之后加入 require_once 'includes/password.inc'; echo ...