Articles of asp.net web api

Web API操作参数间歇性为null

相关问题: Web API ApiController PUT和POST方法间歇性地接收空参数 背景 在对现有Web API项目进行负载测试时,由于参数在发布到操作时为null,因此我注意到很多空引用exception。 原因似乎是在dev环境中运行时为日志请求注册的自定义消息处理程序。 删除此处理程序可解决此问题。 我知道在Web API中我只能读取一次请求体,并且读取它会始终导致我的参数为null,因为模型绑定将无法进行。 出于这个原因,我正在使用带有ContinueWith的ReadAsStringAsync()方法来读取正文。 看起来这在~0.2%的请求中表现奇怪(在使用Apache Bench进行本地调试期间)。 码 在最基本的层面上,我有以下几点: 模型 public class User { public string Name { get; set; } } API控制器 public class UsersController : ApiController { [HttpPost] public void Foo(User user) { if (user == null) { throw new NullReferenceException(); } } } 消息处理程序 […]

在Web API中未发布数据时,请避免使用null模型

这个问题类似于我想要实现的目标: 当没有发布的属性与模型匹配时,在ASP.Net Web API中避免空模型 但它没有得到回答。 我有一个采用GET模型的路线: [HttpGet, Route(“accounts”)] public AccountListResult Post(AccountListRequest loginRequest) { return accountService.GetAccounts(loginRequest); } 该模型使用动作filter中的其他数据填充。 在这种情况下,所有需要知道的是UserId,动作filter将基于cookie /标头添加到模型中,并与请求一起传入。 我想在WebAPI中使用所有默认模型绑定,但我想避免使用null对象。 我不相信模型绑定解决了我的问题。 如何替换Web API模型绑定的行为,以便在没有传入参数时,我将收到一个新实例,而不是Null 这更接近我想要做的事情,除了它的每种类型,这是乏味的。

Web API模型validation和默认值

这是我之前的问题Web API属性路由和validation的精神inheritance者- 可能吗? 我认为这个问题太过笼统。 大多数问题都已解决,但默认值问题仍然存在。 基本上我已经解决了许多难题。 我有这个: [HttpGet] [Route(“test/{id}”] public IHttpActionResult RunTest([FromUri]TestRequest request) { if (!ModelState.IsValid) return BadRequest(ModelState); return Ok(); } 我的TestRequest类: public class TestRequest { public string id { get; set; } [DefaultValue(“SomethingDefault”)] public string something { get; set; } } 问题是,如果something查询字符串中没有参数,则该模型为“有效”,但something为null 。 如果我为something指定了空白值(即GET test/123?something= ),则默认值开始起作用,模型再次有效。 为什么是这样? 如何在此模型中获取默认值? 作为奖励,为什么在未指定参数时,不使用默认值,但是当空白字符串明确特定时,使用默认值? (我一直在浏览ASP.NET堆栈源代码,并且在模型绑定器和绑定上下文中非常深入。但我最好的猜测是不对的 – 看起来只有在参数值为null时才使用DefaultValueAttribute但这不是这里的情况)

WebApi POST不包含ID字段

我仍然只需要几天的ASP.NET和WebAPI框架,所以我必须错过一些非常简单的东西。 我有一个模型,有一些属性和ID(作为一个属性,有一个私有的setter但没有帮助)。 public long ID { get; private set; } [Required(ErrorMessage = “Location coordinate X is required.”)] public double X { get; set; } [Required(ErrorMessage = “Location coordinate Y is required.”)] public double Y { get; set; } 然后我有一个控制器方法post: public HttpResponseMessage Post(MyModel model) 当我启动项目并转到自动生成的API文档时,我可以看到样本包含ID作为输入字段。 我希望API忽略ID输入字段。 我可以自己忽略它,但我不喜欢我的代码中那些必须记住 – 不要使用的东西。 一种选择是为输入创建一个单独的模型,但这意味着我必须维护两个类而不是一个。 是否有任何数据注释完全忽略此属性?

如何使用ASP.Net WebApi重载方法?

我有一种情况,我有两个方法,一个接受poco和另一个poco列表在我的控制器类中: [AcceptVerbs(“PUT”)] [ActionName(“Item”)] public void SaveItem([FromBody] Item item) { m_controller.SaveItem(item); } [AcceptVerbs(“PUT”)] [ActionName(“Items”)] public void SaveItems([FromBody] List items) { m_controller.SaveItem(items); } 我的路由表看起来像: routes.MapHttpRoute(“Item Route”, “api/item/{orderId}”, new { controller = “MyOrder”, action = “Item”, orderId = RouteParameter.Optional }); routes.MapHttpRoute(“Items Route”, “api/items/{orderId}”, new { controller = “MyOrder”, action = “Items”, orderId = RouteParameter.Optional }); 这按预期工作。 但我想重构代码以尝试重载。 我试图重载我的控制器中的方法,只有一个路由但它失败了500错误 […]

如何在Web Api Post请求Json中检测重复键

当请求Json包含重复键时,我需要从ASP.NET Web API Post请求返回400错误。 例如,如果请求是 { “key1”: “value1”, “key2”: 1000, “key2”: 2000, “key3”: “value3” } 然后我想要抛出错误,因为有两个“key2”键。 我的控制器方法看起来像 [HttpPost] public IHttpActionResult PostMethod([FromBody]RequestModel request) { ….. } 和我的RequestModel模型一样 public class RequestModel { [Required] public string Key1 {get; set; } [Required] public int Key2 {get; set; } public string Key3 {get; set; } } 在上面的示例中,Json序列化程序似乎很乐意接受请求并使用2000填充Key2,或者密钥的最后一个实例。 我想我需要做一些涉及JsonSerializerSettings类的事情,或者实现一个自定义的JsonConverter,但我不确定如何继续。

使用MemoryStream和ZipArchive将zip文件返回到asp.net web api中的客户端

我试图使用以下代码将zip文件从asp.net web api返回给客户端: private byte[] CreateZip(string data) { using (var ms = new MemoryStream()) { using (var ar = new ZipArchive(ms, ZipArchiveMode.Create, true)) { var file = archive.CreateEntry(“file.html”); using (var entryStream = file.Open()) using (var sw = new StreamWriter(entryStream)) { sw .Write(value); } } return memoryStream.ToArray(); } } public HttpResponseMessage Post([FromBody] string data) { HttpResponseMessage […]

序列化为JSON,尽管指定了NullValueHandling,但使用Json.NET和Web API省略了Nullable Date

using Newtonsoft.Json; namespace FAL.WebAPI2012.Controllers { public class Person { public int Id {get;set;} public string FirstName {get;set;} public string LastName {get;set;} [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include, NullValueHandling = NullValueHandling.Include)] public DateTime? Dob { get; set; } } public class TestNullsController : ApiController { // GET api/ public Person Get() { Person myPerson = new Person() { Dob […]

从RestSharp客户端将int列表传递给Web API

当我使用REST Sharp下面的代码时,我无法传递listOfSelectedTicketsIds它总是为null。 请求Rest .net客户端 var _stDeveloperApi = new RestClient(“http://127.0.0.1/”); var url = string.Format(“api/v1/SignalR/MultiClickMode”); var listOfSelectedTicketsIds = new List { 2, 3 }; var request = new RestRequest(url, Method.GET); request.AddParameter(“listOfSelectedTicketsIds”, listOfSelectedTicketsIds, ParameterType.GetOrPost); var response = _stDeveloperApi.Execute(request); Web API方法 [HttpGet] public HttpResponseMessage MultiClickMode(List listOfSelectedTicketsIds) { var response = new HttpResponseMessage(); try { } catch (Exception ex) { […]

Web API – 在DbContext类中访问HttpContext

在我的C#Web API应用程序中,我在所有表中添加了CreatedDate和CreatedBy列。 现在,我想在任何表中添加新记录时填充这些列。 为此,我在DbContext类中重写了SaveChanges和SaveChangesAsync函数,如下所示: public class AuthDbContext : IdentityDbContext { public override int SaveChanges() { AddTimestamps(); return base.SaveChanges(); } public override async Task SaveChangesAsync() { AddTimestamps(); return await base.SaveChangesAsync(); } private void AddTimestamps() { var entities = ChangeTracker.Entries().Where(x => (x.State == EntityState.Added)); var currentUsername = !string.IsNullOrEmpty(HttpContext.Current?.User?.Identity?.Name) ? HttpContext.Current.User.Identity.Name : “SYSTEM”; foreach (var entity in entities) […]