Tag: asp.net web api

部署webAPI服务器端所需的最小文件

因此,经过大量的研究,我开始使用webAPI入口点来增强我们的服务服务器堆栈。 基于这个主题 ,特别是Digerati董事会成员的最后一篇文章,我们将webAPI服务作为WCF应用层的外观实现。 (我们的WCF服务只是我们的应用程序层的外观,其中所有行为都存在) 我的问题是这个。 我下载了MVC 4并在我的服务解决方案中创建了一个新的WebAPI项目。 但哇,在我的项目中创造了大量废话,我根本不需要! 例如,所有图像文件,家庭控制器,视图和模型等。 因此,在将其拆解为服务项目时,构建function服务项目所需的最小文件是什么? 我们的目的是在同一服务器中并排发布两种服务类型(WCF和webAPI)。每个服务调用执行相同的相同服务调用并返回请求的特定DTO。 到目前为止,它看起来像App_Start,Controllers和Glabal.asax / web.config条目。 我绝对不需要视图,模型或图像! 关于其他人为完成纯服务部署所做的工作的任何意见都将受到欢迎。

ASP.NET Web API 2 – StreamContent非常慢

我们已经将一个项目从WCF移植到Web API(SelfHost),在此过程中我们注意到在提供Web应用程序时出现了巨大的减速。 现在40-50秒vs 3秒之前。 我通过使用以下控制器为AspNet.WebApi和OwinSelfHost添加各种Nuget pacakges,在一个简单的控制台应用程序中重现了这个问题: var stream = new MemoryStream(); using (var file = File.OpenRead(filename)) { file.CopyTo(stream); } stream.Position = 0; var response = Request.CreateResponse(System.Net.HttpStatusCode.OK); /// THIS IS FAST response.Content = new ByteArrayContent(stream.ToArray()); /// THIS IS SLOW response.Content = new StreamContent(stream); response.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(filename)); response.Content.Headers.ContentLength = stream.Length; 从代码中可以看出,唯一的区别是StreamContent(slooooow)与ByteArrayContent的使用。 该应用程序托管在Win10机器上,可从我的笔记本电脑访问。 Fiddler表示使用StreamContent从服务器到笔记本电脑的单个1MB文件需要14秒,而ByteArrayContent小于1秒。 另请注意,将完整文件读入内存以显示唯一的区别是使用的Content类。 奇怪的是,它的转移本身似乎很慢。 服务器快速/立即响应标头,但数据需要很长时间才能到达,如Fiddler定时信息所示: […]

Json.Net DeserializeObject失败,只有OData.Delta – 整数

这个问题正在影响我的ASP.Net WebApi补丁方法,看起来很像这样: public MyModel Patch(int id, [FromBody]Delta newRecord){/*stuff here*/} 但这不是WebApi的问题 – 失败发生在Json.Net和OData.Delta之间。 问题是JsonConvert.DeserializeObject没有看到OData.Delta对象的整数,我想知道是否有可以应用的解决方法或修复。 更新:在Json.Net库中编写了代码(请参阅下面的右下角),以解决此问题。 只需将它包含在下一次更新中(如果James Newton-King允许的话) 更新2:经过进一步测试,我决定最好的做法是停止使用OData.Delta并自己编写(见答案) 用于certificate问题存在的unit testing(为了清楚起见,使用下面的语句) 测试1:使用int(Int32)失败: class TestObjWithInt { public int Int { get; set; } } [TestMethod] public void IsApplied_When_IntIsDeserializedToDelta() { string testData = “{\”Int\”:1}”; var deserializedDelta = JsonConvert.DeserializeObject<Delta>(testData); var result = deserializedDelta.GetChangedPropertyNames().Contains(“Int”); Assert.IsTrue(result); } 测试2:长成功(Int64) class TestObjWithLong { public […]

如何从Windows服务调用WebAPI

我有一个用Windows Service编写的应用程序,这个应用程序需要调用用Asp.Net MVC 4 WebAPi编写的WebAPI。 WebAPI中的此方法返回具有基本类型的DTO,如: class ImportResultDTO { public bool Success { get; set; } public string[] Messages { get; set; } } 在我的webapi public ImportResultDTO Get(int clientId) { // process.. and create the dto result. return dto; } 我的问题是,如何从Windows服务中调用webApi? 我有我的URL和参数值,但我不知道如何调用以及如何将xml结果反序列化到DTO。 谢谢

如何使用ASP.Net Web Api 2进行部分响应

我是API设计和MVC概念的新手,但据我所知,像GET / api / products这样的东西应该返回一个产品列表,而GET / api / products / 1应该返回一个产品。 在速度方面,我的感觉是/ api / products应该返回较少的信息,即id和name,而/ api / products / 1应该返回更多,即id,name和description。 据我所知,处理此问题的最佳方法是不在/ api / products端点中返回产品类的某些字段。 对于/ api / products?fields = name,这尤其必要。 我正在使用ASP.Net Web Api 2并尝试了以下方法: http://www.nuget.org/packages/WebApi.PartialResponse/ – 安装此软件包导致程序集版本错误。 在Product字段上添加ShouldSerialize方法。 由于我不会进入这里的原因,这种方法有点麻烦。 看看ASP.NET Web API部分响应Json序列化,但似乎没有一个确定的答案。 ASP.NET WebApi和Partial Responses建议使用包含所有可空字段的产品类。 我不确定我到底知道该做什么。 有什么简单的方法可以做我想做的事情吗? 否则你能建议一个比我正在做的更好的API设计吗?

在webapi中使用OData来获取仅在运行时知道的属性

假设我有一个非常简单的类型,我想在OData feed上公开它作为使用.NET C#webapi控制器的集合的一部分: public class Image { /// /// Get the name of the image. /// public string Name { get; set; } public int Id { get; set; } internal System.IO.Stream GetProperty(string p) { throw new System.NotImplementedException(); } private Dictionary propBag = new Dictionary(); internal string GetIt(string p) { return propBag[p]; } } 在我的WebApiConfig.cs中,我做了标准配置: […]

启用跨域ASP.net Web API

我有Microsoft Visual Studio Express 2013 for Web,版本12.0.30501.00更新2.我有一个包含2个项目的解决方案,一个是web api,第二个是用于视图的MVC项目。 我创建了一个简单的web api返回httpresponsemessage,我可以进入fiddler,我将看到json响应。 但是在我尝试通过ajax调用的第二个项目中,我收到了跨域错误。 我试图遵循的解决方案是http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api 。 但是,当在控制台管理器中安装Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebService ,我收到一个错误,所以我使用了这一行。 Install-Package Microsoft.AspNet.WebApi.Cors然后我尝试下一步是config.EnableCors(); 它的状态 ‘System.Web.Http.HttpConfiguration’ does not contain a definition for ‘EnableCors’ and no extension method ‘EnableCors’ accepting a first argument of type ‘System.Web.Http.HttpConfiguration’ could be found (are you missing a using directive or an assembly reference?) […]

我可以将基于接口的对象传递给MVC 4 WebApi POST吗?

我希望有这样的API: public class RelayController : ApiController { // POST api/values public void Post([FromBody]IDataRelayPackage package) { MessageQueue queue = new MessageQueue(“.\\private$\\DataRelay”); queue.Send(package); queue.Close(); } } 我得到’包’的空值,所以我想知道可能出错的地方。 我唯一的想法是默认的JSON序列化程序无法处理这个,但我不清楚如何解决它。

在文档中对API方法进行分组 – 是否存在一些自定义属性

我有控制器喜欢 public class UserController : ApiController { [Route(“api/user”)] IHttpActionResult GetUser() { … } } public class ResumeController : ApiController { [Route(“api/user/resumes”)] IHttpActionResult GetResumes() { … } } 在swagger上产生的输出就像 有没有办法(除了通过推出自己的ISwaggerProvider或将两个控制器合并为一个来覆盖默认实现)来强制执行组名? 就像是 public class UserController : ApiController { [Route(“api/user”)] [MagicalAttributeName(Group=”User”)] IHttpActionResult GetUser() { … } } public class ResumeController : ApiController { [Route(“api/user/resumes”)] [MagicalAttributeName(Group=”User”)] IHttpActionResult GetResumes() { […]

为什么我的区域特定Web API可以从所有其他区域访问?

我目前正在开发一个ASP.NET MVC 4 Web应用程序项目,该项目必须遵循以下设计决策: 主MVC应用程序驻留在解决方案的根目录中。 所有管理员function都位于单独的区域中。 每个外部方(例如供应商)都有自己的区域。 每个区域,包括根,构成一个分离良好的function块。 一个区域的function可能不会暴露给另一个区域。 这是为了防止未经授权的数据访问。 每个区域(包括根)都有自己的RESTfull API(Web API)。 所有区域中的所有常规控制器(包括根)都按预期工作。 但是,我的一些Web API控制器出现意外行为。 例如,有两个具有相同名称但位于不同区域的Web API控制器会产生以下exception: 找到了多个匹配名为“clients”的控制器的类型。 如果为此请求提供服务的路由(’api / {controller} / {id}’)发现多个控制器定义了相同名称但名称不同的命名空间(不受支持),则会发生这种情况。 对’clients’的请求找到了以下匹配的控制器:MvcApplication.Areas.Administration.Controllers.Api.ClientsController MvcApplication.Controllers.Api.ClientsController 这看起来很奇怪,因为我有不同的路线,应该将两者分开。 这是我的管理部门的区域注册: public class AdministrationAreaRegistration : AreaRegistration { public override string AreaName { get { return “Administration”; } } public override void RegisterArea(AreaRegistrationContext context) { context.Routes.MapHttpRoute( name: “Administration_DefaultApi”, routeTemplate: […]