澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:Host的方法来寄宿Web,

第一次发布MVC项目,打开网站

D:项目路径.target项目名.BLL.pdb”。
已完成生成项目“D:项目路径项目名.BLL项目名.BLL.csproj”(默认目标)的操作。
ResolveAssemblyReferences:
主引用“System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL”。
C:WindowsMicrosoft.NETFrameworkv4.0.30319Microsoft.Common.targets(1605,5): warning MSB3245: 未能解析此引用。未能找到程序集“System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL”。请检查磁盘上是否存在该程序集。 如果您的代码需要此引用,则可能出现编译错误。 [D:项目路径项目名.Web项目名.Web.csproj]
用于 SearchPath“{HintPathFromItem}”。
已考虑使用“..packagesMicrosoft.AspNet.WebApi.WebHost.5.2.3libnet45澳门新浦京娱乐场网站,System.Web.Http.WebHost.dll”,但它不存在。
用于 SearchPath“{TargetFrameworkDirectory}”。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Web.Http.WebHost.exe”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5FacadesSystem.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5FacadesSystem.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5FacadesSystem.Web.Http.WebHost.exe”,但它不存在。
用于 SearchPath“{Registry:SoftwareMicrosoft.NETFramework,v4.5,AssemblyFoldersEx}”。
已考虑 AssemblyFoldersEx 位置。
用于 SearchPath“{AssemblyFolders}”。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.Web.Http.WebHost.exe”,但它不存在。
已考虑使用“C:Program Files (x86)Microsoft SQL Server110SDKAssembliesSystem.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“C:Program Files (x86)Microsoft SQL Server110SDKAssembliesSystem.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“C:Program Files (x86)Microsoft SQL Server110SDKAssembliesSystem.Web.Http.WebHost.exe”,但它不存在。
已考虑使用“C:Program FilesIISMicrosoft Web Deploy V3System.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“C:Program FilesIISMicrosoft Web Deploy V3System.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“C:Program FilesIISMicrosoft Web Deploy V3System.Web.Http.WebHost.exe”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.5System.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.5System.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.5System.Web.Http.WebHost.exe”,但它不存在。
已考虑使用“C:Program Files (x86)Microsoft.NETADOMD.NET110System.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“C:Program Files (x86)Microsoft.NETADOMD.NET110System.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“C:Program Files (x86)Microsoft.NETADOMD.NET110System.Web.Http.WebHost.exe”,但它不存在。
用于 SearchPath“{GAC}”。
已考虑使用“System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL”,但未在 GAC 中找到它。
用于 SearchPath“{RawFileName}”。
已考虑将“System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL”视为文件名,但它不存在。
用于 SearchPath“D:项目路径.target”。
已考虑使用“D:项目路径.targetSystem.Web.Http.WebHost.winmd”,但它不存在。
已考虑使用“D:项目路径.targetSystem.Web.Http.WebHost.dll”,但它不存在。
已考虑使用“D:项目路径.targetSystem.Web.Http.WebHost.exe”,但它不存在。

ASP.NET Web API 开篇示例介绍

Common类及实体定义、Web API的定义请参见我的上一篇文章:以Web Host的方式来寄宿Web API。

未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项。系统找不到指定的文件。

ASP.NET Web API

对于我这个初学者来说ASP.NET Web API这个框架很陌生又熟悉着。

陌生的是ASP.NET Web API是一个全新的框架,对于这个框架在一个项目中起到的作用我暂且还不是很清楚这里也就不妄下结论了,说实话不是我不想而是我无能为力,只能自己去摸索试着去了解它。

熟悉的是ASP.NET Web API跟ASP.NET MVC的框架结构一开始看起来有一些相似的地方。

话就不多说了,大家就和我一起来学习ASP.NET Web API这个全新的框架吧。

一、以Self Host寄宿需要新建一个Console控制台项目(SelfHost)

这个项目也需要引用之前定义的WebApi项目或者把WebApi.dll放到此项目的执行Bin目录下,

另外,需要引用的DLLs如下:

  1. System.Web.Http.dll  (C:Program Files (x86)Microsoft ASP.NETASP.NET MVC 4AssembliesSystem.Web.Http.dll)
  2. System.Web.Http.WebHost.dll(C:Program Files (x86)Microsoft ASP.NETASP.NET MVC 4AssembliesSystem.Web.Http.WebHost.dll)
  3. System.Net.Http.dll(C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.6System.Net.Http.dll)

具体代码如下:

 1 using System;
 2 using System.Reflection;
 3 using System.Threading.Tasks;
 4 using System.Web.Http;
 5 using System.Web.Http.SelfHost;
 6 
 7 namespace SelfHost
 8 {
 9     internal static class Program
10     {
11         private static void Main(string[] args)
12         {
13             // 加载包含Web API的程序集
14             Assembly.Load("WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
15 
16             // 采用BaseAddress来初始化HTTP服务的配置类
17             var configuration = new HttpSelfHostConfiguration("http://localhost/selfhost");
18 
19             // 生成直接侦听HTTP的Server实例 
20             using (var httpServer = new HttpSelfHostServer(configuration))
21             {
22                 // 注册路由
23                 httpServer.Configuration.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });
24                 var task = httpServer.OpenAsync();
25                 if (task.Status == TaskStatus.WaitingForActivation)
26                 {
27                     Console.WriteLine("Http Server started!");
28                 }
29                 Console.Read();
30             }
31         }
32     }
33 }

 WCF服务寄宿的时候我们必须指定寄宿服务的类型,但是对于ASP.NET Web API的寄宿来说,不论是Web Host还是Self Host我们都无须指定IHttpController的类型。也就是说,WCF服务寄宿是针对具体某个服务类型的,而ASP.NET Web API的寄宿则是批量的。ASP.NET Web API的批量寄宿源自它对HttpController类型的智能解析,它会从程序集列表中解析出所有的HttpController类型。对于WebHost来说,它会利用BuildManager来获得当前项目直接或者间接引用的程序集,但是对于Self Host来说,类型的解析在默认情况下只会针对加载到当前应用程序域中的程序集列表。

问题原因:缺少配置文件(System.Net.Http.Formatting.dll,System.Web.Http.dll, System.Web.Http.WebHost.dll)

ASP.NET Web API演示示例

环境基础配置

首先我们新建一个类库项目命名为Common,并且定义个货品信息类型,示例代码如下:

澳门新浦京娱乐场网站:Host的方法来寄宿Web,net运转时dll的物色路线顺序。代码1-1

namespace Common{    public class Product    {        public string ProductID { get; set; }        public string ProductName { get; set; }        public string ProductCategory { get; set; }    }}

建立WebHost宿主环境

然后我们接着创建一个空的ASP.NET WEB应用程序命名为WebHost,这里说明一下ASP.NET Web API框架只是个独立框架,它并不能独立运行,所以它需要宿主环境,刚刚我们新建的WEB应用程序则会在下面的示例中暂时的承载着ASP.NET Web API框架来运行。

引用程序集

Newtonsoft.Json.dll 路径: C:Program FilesMicrosoft ASP.NETASP.NET MVC 4PackagesNewtonsoft.Json.4.5.6libnet40Newtonsoft.Json.dll

System.Net.Http.dll 路径:C:Program FilesMicrosoft ASP.NETASP.NET MVC 4Assemblies System.Net.Http.dll

System.Net.Http.Formatting.dll路径:C:Program FilesMicrosoft ASP.NETASP.NET MVC 4Assemblies System.Net.Http.Formatting.dll

System.Web.Http.dll 路径:C:Program FilesMicrosoft ASP.NETASP.NET MVC 4Assemblies System.Web.Http.dll

System.Web.Http.WebHost.dll路径:C:Program FilesMicrosoft ASP.NETASP.NET MVC 4AssembliesSystem.Web.Http.WebHost.dll

Common.dll

或者采用这种引用方式:

澳门新浦京娱乐场网站 1

(如果上文中所述的目录位置没有Newtonsoft.Json.dll的话可以文件搜索一下,然后手动引用。)

随之我们再建立一个Web应用程序处理类Globl.asax ,并在其Application_Start()方法中注册路由,示例代码如下:

代码1-2

using System.Web.Http;namespace WebHost{    public class Global : System.Web.HttpApplication    {        protected void Application_Start(object sender, EventArgs e)        {            GlobalConfiguration.Configuration.Routes.MapHttpRoute(              "DefaultAPI", "api/{controller}/{id}", new { controller="product",id = RouteParameter.Optional });        }    }}

路由注册好了之后,我们还得新建个Web API控制器,命名为ProductController,示例代码如下:

代码1-3

using System.Web.Http;using Common;namespace WebHost.Controllers{    public class ProductController:ApiController    {        private static List<Product> products;        static ProductController()        {            products = new List<Product>();            products.AddRange(                new Product[]                 {                    new Product(){ ProductID="001", ProductName="牙刷",ProductCategory="洗漱用品"},                    new Product(){ ProductID="002", ProductName="《.NET框架设计—大型企业级应用框架设计艺术》", ProductCategory="书籍"}                });        }        public IEnumerable<Product> Get(string id = null)        {            return from product in products where product.ProductID == id || string.IsNullOrEmpty select product;        }    }}

在代码1-3中我们看到ProductController控制器继承自ApiController,这里的方式我的猜想应该是跟ASP.NET MVC框架对控制器的处理一样,在请求到来之后并且经过路由处理之后,Web API框架会把当前项目中所有引用的程序集全部查找一下并且搜出继承自ApiController的类型,并且缓存在一个xml文件,不知道猜想的对不对在后面的篇幅我们再来验证,这里提一下。

细心的朋友的可能发现在路由注册的时候并没有对应的Action的路由参数,其实这里就是Web API框架的一个不同之处,它是根据Http请求方法来确定Action的方法的,然而浏览器默认的请求方法就是Http-get,所以我们这个时候可以直接运行项目。

图2

澳门新浦京娱乐场网站 2

建立SelfHost

下面我们来看一下在SelfHost宿主环境中ASP.NET Web API框架的使用示例。

首先我们新建一个控制台应用程序命名为SelfHost,SelfHost环境项目的程序集引用和上面所说的WebHost项目引用唯一不同的就是把System.Web.Http.WebHost.dll程序集换成System.Web.Http.SelfHost.dll程序集,引用路径不变,也可以利用引用里的扩展栏来添加。

下面就让我们看一下在SelfHost中我们需要做哪些事,首先我们需要注册路由这是每次最先做的事情,示例代码如下:

代码1-4

using System.Web.Http;using System.Web.Http.SelfHost;namespace SelfHost{    class Program    {        static void Main(string[] args)        {            HttpSelfHostConfiguration selfHostConfiguration =                new HttpSelfHostConfiguration("http://localhost/selfhost");            using (HttpSelfHostServer selfHostServer = new HttpSelfHostServer(selfHostConfiguration))            {                selfHostServer.Configuration.Routes.MapHttpRoute(                    "DefaultApi", "api/{controller}/{id}", new { id=RouteParameter.Optional});                selfHostServer.OpenAsync();                Console.WriteLine("服务器端服务监听已开启");                Console.Read();            }        }    }}

这里就简要的说明一下,在1-4代码中HttpSelfHostConfiguration对象示例中设置了基地址,对于HttpSelfHostConfiguration类型它是继承自HttpConfiguration类型,HttpConfiguration类型是比较重要的一个类型,WebAPI框架中大多数的配置信息都在此类型实例中进行设置。在后续的篇幅中会有说到。

HttpSelfHostServer对象就是在SelfHost宿主环境中担当着很重要的角色,它负责处理请求等一系列操作(因为它是WebAPI框架在SelfHost环境中的管道模型的“龙头”),在这里只要稍作了解就行了,会在后面的管道篇幅揭开它的神秘面纱。

继续向下看我们会看到HttpSelfHostServer对象实例中的Configuration属性里的Routes属性提供了对路由的注册,这部分内容会在后面的路由篇幅讲解。

再之后就是我们看到的,打开服务监听,等待处理请求。(这里的监听/处理请求,并不是对真正的请求进行处理,而是对已经请求被封装好了的对象进行处理,管道篇幅中讲解)

在路由注册之后我们要新建个Web API控制器,就如同上面WebHost部分内容一样,拷贝一份过来,不过我们这里要对控制器的代码稍作修改,示例代码如下:

代码1-5

using System.Web.Http;using Common;namespace SelfHost.Controllers{    public class ProductController:ApiController    {        private static List<Product> products;        static ProductController()        {            products = new List<Product>();            products.AddRange(                new Product[]                 {                    new Product(){ ProductID="001", ProductName="牙刷",ProductCategory="洗漱用品"},                    new Product(){ ProductID="002", ProductName="《.NET框架设计—大型企业级应用框架设计艺术》", ProductCategory="书籍"}                });        }        public IEnumerable<Product> Get(string id = null)        {            return from product in products where product.ProductID == id || string.IsNullOrEmpty select product;        }        public void Delete(string id)        {            products.Remove(products.First(product => product.ProductID == id));        }        public void Post(Product product)        {            products.Add;        }        public void Put(Product product)        {            Delete(product.ProductID);            Post;        }    }}

对于在代码1-5中控制器新增的几个Action方法,也是分别对应着Http请求方法。这样也就是能实现增删改查的基础功能了。那我们还需要一个对它进行访问的客户端。

建立Clinet

我们再建一个控制台应用程序命名为Clinet,并且添加如下程序集引用:

Newtonsoft.Json.dll 路径: C:Program FilesMicrosoft ASP.NETASP.NET MVC 4PackagesNewtonsoft.Json.4.5.6libnet40Newtonsoft.Json.dll

System.Net.Http.dll 路径:C:Program FilesMicrosoft ASP.NETASP.NET MVC 4Assemblies System.Net.Http.dll

System.Net.Http.Formatting.dll路径:C:Program FilesMicrosoft ASP.NETASP.NET MVC 4Assemblies System.Net.Http.Formatting.dll

Common.dll

下面我们看一下在Client项目中对SelfHost环境中的资源进行访问的示例,示例代码如下:

代码1-6

using Common;using System.Net.Http;namespace Client{    class Program    {        static void Main(string[] args)        {            AsyncProcess();            Console.Read();        }        private async static void AsyncProcess()        {            HttpClient httpClient = new HttpClient();            //获取货品信息列表            HttpResponseMessage responseMessage =                await httpClient.GetAsync("http://localhost/selfhost/api/product");            IEnumerable<Product> products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();            OutputProductInfo;            //添加货品            Product product = new Product()            {                ProductID = "003",                ProductName = "《ASP.NET Web API 2 框架揭秘》",                ProductCategory = "食品类"            };            await httpClient.PostAsJsonAsync<Product>("http://localhost/selfhost/api/product", product);            responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product");            products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();            OutputProductInfo;            //修改指定货品信息            responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product/003");            product = (await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>.First();            product.ProductCategory = "书籍";            await httpClient.PutAsJsonAsync<Product>("http://localhost/selfhost/api/product", product);            responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product");            products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();            OutputProductInfo;            //删除指定货品            await httpClient.DeleteAsync("http://localhost/selfhost/api/product/001");            responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product");            products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();            OutputProductInfo;        }        private static void OutputProductInfo(IEnumerable<Product> products)        {            foreach (Product product in products)            {                Console.WriteLine(                    "ProductID:{0},ProductName:{1},ProductCategorm:{2}",                    product.ProductID, product.ProductName, product.ProductCategory);            }            Console.WriteLine("—————————————————————————");        }    }}

对于代码1-5中出现诸多的类型会在后面的篇幅中一一的讲解,这里就不做阐述了,而是看一下我们最终的示例结果:

首先我们要运行SelfHost项目,等待界面和如下图3时,再行Client项目对SelfHost中的资源进行访问。结果如图4

图3

澳门新浦京娱乐场网站 3

图4

澳门新浦京娱乐场网站 4

参考资料:

就是仿照蒋大书籍中的示例简化了一下做了一点调整,因为后面的篇幅中有用到这个示例。

这里吐槽一下起初国内对于Web API的书籍资料几乎没有,当然国外的有是有,不过都是英文版的。对于毫无英语基础的我等于是判了死缓,唯一的活路就是用翻译工具一点点的去看。

澳门新浦京娱乐场网站 5

还好蒋大的新作出来了,不然想学Web API还真是无路可走。已看完前三章,收获颇多知识点很全面,在后面我学习到一些都会写出来跟大家分享。

澳门新浦京娱乐场网站 6

出处:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

二、测试

把SelfHost项目设置为启动项目,Ctrl F5执行程序;

澳门新浦京娱乐场网站 7澳门新浦京娱乐场网站 8

解决方法:在bin文件下面加入这些dll文件

文件地址:

本文由澳门新浦京娱乐场网站发布于新浦京娱乐场官网,转载请注明出处:澳门新浦京娱乐场网站:Host的方法来寄宿Web,