Tag: asp.net web api

ASP.NET Web API操作方法参数的dependency injection

我正在使用C#中的ASP.NET Web API项目来获取移动应用程序的JSON接口。 我的想法是为所有请求创建接口,然后仅在Web API代码中使用这些接口。 我最终得到了这样的东西: public interface IApiObject {} public interface IApiResponse : IApiObject where T : IApiObject {} public interface IApiRegistrationRequest : IApiObject {} 我的控制器看起来像这样: public class MyApiController : ApiController { public IApiResponse Register(IApiRegistrationRequest request) { // do some stuff } } 我的Web API项目还包含这些接口的实现。 我假设Web API项目使用像MVC项目那样的模型绑定,因此我创建了一个inheritance感知的ModelBinderProvider,用于为所有IApiObjects提供一个绑定器,并使用Unity容器为其实现的接口解析自定义模型绑定器。 但是,经过一些调查,我发现了Web API 如何进行参数绑定,并发现Web API使用格式化程序而不是复杂类型的模型绑定程序。 链接的博客文章建议在我的操作参数上使用ModelBinderAttribute,但该属性仅接受类型作为参数。 但是,我的自定义模型绑定器不包含空构造函数(它需要一个统一容器),所以我需要传递它的一个实例。 我能想到的另一种方法是使用dependency […]

覆盖WebHostBufferPolicySelector以进行非缓冲文件上载

在尝试创建非缓冲文件上载时,我扩展了System.Web.Http.WebHost.WebHostBufferPolicySelector,覆盖了本文所述的函数UseBufferedInputStream(): http : //www.strathweb.com/2012/09/dealing -with-large-files-in-asp-net-web-api / 。 当一个文件POST到我的控制器时,我可以在跟踪输出中看到被覆盖的函数UseBufferedInputStream()肯定会按预期返回FALSE。 但是,使用诊断工具,我可以看到内存随着文件上传而增长。 大量内存使用似乎发生在我的自定义MediaTypeFormatter中(类似于FileMediaFormatter: http ://lonetechie.com/)。 在这个格式化程序中,我想逐步将传入的文件写入磁盘,但我还需要解析json并使用Content-Type:multipart / form-data upload执行其他操作。 因此我使用HttpContent方法ReadAsMultiPartAsync(),这似乎是内存增长的来源。 我已经在“await”之前/之后放置了跟踪输出,并且看起来当任务阻塞时,内存使用量会相当快地增加。 一旦我在ReadAsMultiPartAsync()返回的部分中找到文件内容,我就使用Stream.CopyTo()将文件内容写入磁盘。 这按预期写入磁盘,但不幸的是,此时源文件已经在内存中。 有没有人对可能出现的问题有任何想法? 似乎ReadAsMultiPartAsync()正在缓冲整个post数据; 如果这是真的,为什么我们需要var fileStream = await fileContent.ReadAsStreamAsync()来获取文件内容? 是否有另一种方法来完成部分的拆分而不将它们读入内存? 我的MediaTypeFormatter中的代码如下所示: // save the stream so we can seek/read again later Stream stream = await content.ReadAsStreamAsync(); var parts = await content.ReadAsMultipartAsync(); // x.Headers.ContentDisposition.DispositionType.ToLower().Trim() == “form-data” && x.Headers.ContentDisposition.Name.ToLower().Trim() […]

在ASP.NET WebApi中实现移动应用程序的外部身份validation2

我正在尝试构建一个API(使用ASP.NET WebApi),该API将由本机移动应用程序用于学校项目。 (我不关心/开发移动应用程序,这个责任属于不同的成员)我正处于需要实现基于令牌的Facebook登录的地步。 有很多教程可用于如何为基于浏览器的应用程序实现此function(这是非常直接的,其中大部分是内置的),但我不认为我遵循如何使用本机应用程序。 我不明白重定向是如何工作的? 根据此链接 ,我的服务器无需专门处理任何内容。 我不认为我明白这是如何工作的? 如何处理来自Facebook的令牌? 此外,我应该实现令牌处理的哪个部分,我无法找到WebApi外部登录身份validation的良好文档。 无论如何,如果有人能指出我发生的令牌交换的确切流程以及ASP.NET默认实现的内容,那将是非常有用的。 此外,对我来说最大的困惑是我不明白Facebook将返回的令牌将如何处理。 我假设令牌将返回给客户端(移动应用程序),如何在我的服务器上访问它? 如何从facebook的令牌创建本地令牌? 这一切都是由ASP.NET内部/自动魔术完成的吗? 对不起,如果这是我应该弄明白的话。 我做了很多研究,发现自己陷入了(相关和无关)的信息。 我不认为我甚至不知道如何搜索我需要的信息。 我读过的一些链接: 声明和基于令牌的身份validation(ASP.NET Web API) 使用ASP.NET Web API 2,Owin和Identity进行基于令牌的身份validation 在AngularJS应用程序中使用Facebook和Google进行ASP.NET Web API 2外部登录

Web api性能?

我刚在想 , WebApi和routing mechanism工作方式是它读取http verb (GET POST等…),然后搜索匹配的方法名称/参数: 例如 : 如果它是GET并且URI是api/Customers/5 : 方法应该从Get开始 如果它有ID那么搜索一个接受int作为参数的方法。 等(有更多规则)。 我大多相信他们是用reflection做的。 题 : 对于每个URI请求来说,搜索所有这些数据只是为了附加方法,这不是一个性能损失吗? 我可以轻松地从客户端发送一个非常短的字符串,这将暗示服务器端的方法? 为什么不以简单的方式做到这一点? 好的,因为我们想要使用http动词作为意义。 好。 但是执行方法只需要很多操作 例子#1 get api/Customers/5 可能 a.ashx?m=gc&id=5 (method=GetCustomer & id=5) 例子#2 put api/Customers/5?v=123 可能 a.ashx?m=uc&id=5?v=123′ (method=UpdateCustomer & id=5 & value=123) 我的更短。 别误会我的意思。 我相信这个api是由非常聪明的人完成的,他们知道他们在谈论什么。 只想知道我错过了什么。

ASP.NET Core API POST参数始终为null

我看过以下内容: Asp.net Core Post参数始终为null asp.net webapi 2 post参数始终为null web-api POST正文对象始终为null Web Api参数始终为null 我的终点: [HttpPost] [Route(“/getter/validatecookie”)] public async Task GetRankings([FromBody] string cookie) { int world = 5; ApiGetter getter = new ApiGetter(_config, cookie); if (!await IsValidCookie(getter, world)) { return BadRequest(“Invalid CotG Session”); } HttpContext.Session.SetString(“cotgCookie”, cookie); return Ok(); } 我的请求: $http.post(ENDPOINTS[“Validate Cookie”], cookie , {‘Content-Type’: ‘application/json’}); 其中cookie是我从用户输入发送的字符串。 […]

asp web api补丁实现

假设我有这个模型 public partial class Todo { public int id { get; set; } public string content { get; set; } public bool done { get; set; } } 我将此作为json数据发送到我的控制器作为补丁请求。 这绝对是一个复选框的动作。 我认为我只想把它发送到我的服务器,而不是整个模型。 { “id”:1, “done” : true } 为了正确处理这个简单的json补丁请求,我的WebApi控制器需要看起来是什么样的? 我应该使用web api,还是应该使用更多rpc风格的mvc方法? 这似乎是一件非常基本的事情,但我似乎无法做到正确! 我想我可能需要在我的控制器方法中使用不同的参数,但我不确定。 感谢您的时间。

ASP.NET WebApi – 一个控制器中的多个GET操作

我有Users控制器和基本的REST模式工作正常。 但是,我需要一个额外的模式users/{id}/usergroups ,它将返回该用户的所有用户组。 实现这一目标的最佳方法是什么,因为我想我将需要更多控制器上的类似路由。 只是默认的还不够…… 错误 找到了与请求匹配的多个操作:Api.Models.Users.User GetUser(Int32)类型Api.Controllers.UsersController System.Collections.Generic.IEnumerable`1 [Api.Models.Users.UserGroup] GetUserGroups(Int32)on键入Api.Controllers.UsersController 码 // GET api/Users public IEnumerable GetUsers() // GET api/Users/5 public User GetUser(int id) // THIS IS CONFLICT 1 // PUT api/Users/5 public HttpResponseMessage PutUser(int id, User user) // POST api/Users public HttpResponseMessage PostUser(User user) // DELETE api/Users/5 public HttpResponseMessage DeleteUser(int id) // GET […]

ASP.NET Web API日志记录和跟踪

一旦使用适用于ASP.NET Web API的log4net进行日志记录和跟踪设置,需要记录和/或跟踪的具体方面是什么? 我从Web API的角度来看这个问题。 是否有一系列必须记录这个或必须跟踪这个 。 就像,INFO跟踪控制器的请求,任何NULL检查等。 是否有可以validation的参考列表,以确保ASP.NET Web API中的最佳日志记录和跟踪覆盖率?

使用Web API Action中的HttpClient调用外部HTTP服务

我在.Net Framework 4.5上运行的ASP.Net MVC 4 Web Api项目中使用HttpClient调用外部服务 示例代码如下(忽略返回值,因为这是测试调用外部服务的示例代码): public class ValuesController : ApiController { static string _address = “http://api.worldbank.org/countries?format=json”; private string result; // GET api/values public IEnumerable Get() { GetResponse(); return new string[] { result, “value2” }; } private async void GetResponse() { var client = new HttpClient(); HttpResponseMessage response = await client.GetAsync(_address); response.EnsureSuccessStatusCode(); result […]

Web.API MapHttpRoute参数

我的Web.API路由有问题。 我有以下两条路线: config.Routes.MapHttpRoute( name: “MethodOne”, routeTemplate: “api/{controller}/{action}/{id}/{type}”, defaults: new { id = RouteParameter.Optional, type = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: “MethodTwo”, routeTemplate: “api/{controller}/{action}/{directory}/{report}”, defaults: new { directory = RouteParameter.Optional, report = RouteParameter.Optional } ); 在我的控制器中这两种方法: [HttpGet] [ActionName(“methodone”)] public string MethodOne(string id, string type) { return string.Empty; } [HttpGet] [ActionName(“methodtwo”)] public string MethodTwo(string directory, string report) […]