Tag: asp.net web api

为什么我的异步ASP.NET Web API控制器阻塞主线程?

我有一个ASP.NET Web API控制器,我原本认为它可以异步操作。 控制器设计为第一次请求hibernate20秒,但立即为任何后续请求提供服务。 所以我预期的时间表是这样的: 提出要求1。 提出要求2。 提出要求3。 请求2返回。 请求3返回。 等~20秒。 请求1返回。 相反,在请求1完成之前, 没有请求返回。 我可以确认(基于调试输出),入口线程和困线程id是不同的。 我故意使用TaskCreationOptions.LongRunning强制将睡眠强制到一个单独的线程,但是在睡眠完成之前,应用程序仍然拒绝为任何新请求提供服务。 我是否遗漏了有关异步Web API控制器如何工作的基本信息? public class ValuesController : ApiController { private static bool _firstTime = true; public async Task Get() { Debug.WriteLine(“Entry thread id: {0}. Sync: {1}”, Thread.CurrentThread.ManagedThreadId, SynchronizationContext.Current); await LongWaitAsync(); return “FOOBAR”; } private Task LongWaitAsync() { return Task.Factory.StartNew(() => […]

WebAPI OData $格式为xml

对于我的WebAPI OData应用程序,我试图让我的客户端(浏览器)决定数据输出应该是什么格式。 由于$ format尚未在WebAPI OData中实现,我在这里使用Raghuramn的示例: https ://gist.github.com/raghuramn/5556691 var queryParams = request.GetQueryNameValuePairs(); var dollarFormat = queryParams.Where(kvp => kvp.Key == “$format”).Select(kvp => kvp.Value).FirstOrDefault(); if (dollarFormat != null) { request.Headers.Accept.Clear(); request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(dollarFormat)); // remove $format from the request. request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = queryParams.Where(kvp => kvp.Key != “$format”); } 这适用于JSON($ format = application / json; odata = fullmetadata)和JSON light(format = application / […]

如何创建一个文件来填充HttpContext.Current.Request.Files?

在我的Web API中,POST操作方法在服务器上上传文件。 对于unit testing此方法,我需要创建一个HttpContext并将一个文件放在其请求中: HttpContext.Current.Request.Files 到目前为止,我正在伪造HttpContext与这个完美的代码: HttpRequest request = new HttpRequest(“”, “http://localhost/”, “”); HttpResponse response = new HttpResponse(new StringWriter()); HttpContext.Current = new HttpContext(request, response); 请注意,我不想使用Moq或任何其他Mocking库。 我怎么能做到这一点? (多部分内容可能吗?) 谢谢

在web api中传递Dictionary 参数

我正在尝试将Dictionary对象作为参数传递给我的web api方法,但如果我检查日志文件,它总是会计数为0: Web api方法: [HttpPost] [ActionName(“SendPost”)] public void SendPost([FromBody] Dictionary values) { using (var sw = new StreamWriter(“F:\\PostTest.txt”, true)) { sw.WriteLine(“Number of items in the dictionary – ” + values.Count); } } 调用web api的逻辑: public HttpResponseMessage Send(string uri, string value) { HttpResponseMessage responseMessage = null; using (var client = new HttpClient()) { client.BaseAddress = new […]

使用路由属性时设置web api路由处理程序

我有一个自定义路由处理程序,我想在不同的控制器上使用。 现在我让控制器使用这个路由处理程序的唯一方法就是设置它 RouteTable.Routes.MapHttpRoute( name: “CustomRouteHandler”, routeTemplate: “/custom/{controller}/{action}”, defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional } ).RouteHandler = new CustomRouteHandler(); 我真的想使用像这样的路由属性 [HttpGet] [Route(Name = “GetCart”)] public Cart Get() { return _repository.Get(); } 但是,当我使用路由属性时,似乎无法弄清楚如何确保我使用自定义路由处理程序。 优选我只会使用路由属性,所以如果我可以使用像“RouteHandler”这样的属性,这里指向我的“CustomRouteHandler”,这将是完美的。 有没有我可以这样使用的属性,或者我可以在某种程度上将MapHttpRoute中的所有内容指向“/ Custom”,然后使用此处的路由属性并使所有控制器都具有自定义处理程序? 另一种选择可能是让我自己的属性,使控制器或方法使用我的自定义路由处理程序? 我正在尝试为开发人员制作一个非常清晰的方法,看看这个控制器或方法是使用自定义路由处理程序,如果新开发人员应该添加另一个控制器,他们可以使用特殊路由,如“/ custom”或使用属性。 任何想法都非常受欢迎。 谢谢。

如何在Asp.net Web API中使用特定的CultureInfo

我最近在现有的VS桌面应用程序中添加了WEB API,一切正常,直到昨天我必须添加一个带有三个参数的GET方法,其中一个是Date。 好吧,起初我认为那将是一块蛋糕,但令我惊讶的是,我注意到当我在安装应用程序的服务器上发送2014/07/09(7月9日)时,它被视为2014年/ 09/07(9月7日)因此我所有的比较都没有奏效。 我尝试过从GET方法更改为POST方法,在服务器上更改区域和语言选项设置,将日期作为字符串传递,使用字符串的部分在服务器上创建Datetime对象。 不幸的是他们都没有工作。 然后我记得这个桌面应用程序在其WCF项目上有一些方法(我现在传递给web API),它完全没有问题地传递日期。 查看代码一段时间后,我发现他们在使用日期的WCF项目的每个类中使用了类似的东西: Imports System.Globalization Imports System.Security.Permissions Imports System.Threading Public Class ServicioRemotoVentas Implements IServicioRemotoVentas Public Sub New() MyBase.New() Thread.CurrentThread.CurrentCulture = New CultureInfo(“es-PE”, False) End Sub 当然这个Thread.CurrentThread.CurrentCulture = New CultureInfo(“es-PE”,False)必须存在。 现在我想知道你以前是否在Web API中使用过类似的东西? 如果是这样,你如何以及在哪里放置这样的配置。 这些是我电脑上的设置: 这些是服务器设置: 我几乎忘了提到我使用这个格式yyyy / M / d以及使用json的所有其他参数传递所有日期。 是否可能在Web API中对字符串进行反序列化时,这是使用系统日期格式完成的,因为我没有指定要使用的文化信息? 或者在尝试序列化/反序列化日期时可能是Json错误? 与往常一样,您可以提供的任何建议或资源将不胜感激。

entity framework在Web api / MVC中使用异步控制器进行处理

我有这个小代码示例: public class ValueController : ApiController { private EstateContext _db; public ValueController() { _db = new EstateContext(); } [HttpPost] public async void DoStuff(string id) { var entity = await _db.Estates.FindAsync(id); //now our method goes out and Dispose method is calling //returns here after disposing _db.SaveChanges(); // _db is disposed } protected override void Dispose(bool disposing) […]

WebApi在filter内获取后期原始主体

我’创建一个日志,我需要检索请求体以保存在db中。 我用HttpActionContext创建了一个filter。 我尝试通过filterContext.Request.Content.ReadAsStringAsync()恢复。 但它总是给我一个空字符串。 LogFilter.cs public override void OnActionExecuting(HttpActionContext filterContext) { try { Task content = filterContext.Request.Content.ReadAsStringAsync(); string body = content.Result; logModel.RequestLog rl = new logModel.RequestLog(); rl.IP = ((HttpContextWrapper)filterContext.Request.Properties[“MS_HttpContext”]).Request.UserHostAddress; rl.Type = filterContext.ControllerContext.RouteData.Values[“controller”].ToString().ToUpper(); rl.URL = filterContext.Request.RequestUri.OriginalString; rl.Operation = filterContext.Request.Method.Method; rl.RequestDate = DateTime.Now; filterContext.ControllerContext.RouteData.Values.Add(“reqID”, new deviceLog.RequestLog().Add(rl).ID.ToString()); } catch { } //return new deviceLog.RequestLog().Add(rl); base.OnActionExecuting(filterContext); }

使用Web API进行模型绑定接口属性

我有一个命令看起来像: public interface ICommand { // Just a marker interface } public interface IUserAware { Guid UserId { get; set; } } public class CreateSomething : ICommand, IUserAware { public string Title { get; set; } public Guid UserId { get; set; } } REST请求是: PUT /create HTTP/1.1 UserId: 7da6f9ee-2bfc-70b1-f93c-10c950c8f6b0 // Possible an Auth token […]

IE VS Chrome和Firefox中的网络安全(bug)

为什么Web Security在不同的浏览器上的工作方式不同: 细节: 我有两个申请 一个是简单的HTML应用程序,另一个是ASP.NET MVC4 WebApi应用程序,项目在同一个解决方案中,我已经设置了多个启动项目来同时运行应用程序。 工作版本: 我在Web API项目中使用了Web Security。 我完全实现了网络安全…… 登录操作代码 // GET api/company [System.Web.Http.AcceptVerbs(“Post”)] [System.Web.Http.HttpPost] public HttpResponseMessage Login(LoginRequest loginRequest) { try { if (WebSecurity.Login(loginRequest.EmailAddress, loginRequest.Password, true)) { var userDetails = new string[2]; userDetails[0] = loginRequest.EmailAddress; var currentUSerRole = Roles.GetRolesForUser(loginRequest.EmailAddress); userDetails[1] = currentUSerRole[0].ToString(); HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Accepted, userDetails); return response; } else { […]