Tag: asp.net web api

使用媒体类型对ASP.NET Web API 2进行版本控制

我正在使用ASP.NET Web API 2进行属性路由,但我似乎无法使用媒体类型application/vnd.company[.version].param[+json]进行版本控制。 我收到以下错误: 给定的密​​钥不在字典中。 它源于在FindActionMatchRequiredRouteAndQueryParameters()方法中测试键_actionParameterNames[descriptor] 。 foreach (var candidate in candidatesFound) { HttpActionDescriptor descriptor = candidate.ActionDescriptor; if (IsSubset(_actionParameterNames[descriptor], candidate.CombinedParameterNames)) { matches.Add(candidate); } } 来源: ApiControllerActionSelector.cs 经过进一步调试后,我意识到如果你有两个控制器 [RoutePrefix(“api/people”)] public class PeopleController : BaseApiController { [Route(“”)] public HttpResponseMessage GetPeople() { } [Route(“identifier/{id}”)] public HttpResponseMessage GetPersonById() { } } [RoutePrefix(“api/people”)] public class PeopleV2Controller : BaseApiController { […]

为什么我不能两次读取Http Request Input流?

我正在添加一些调试代码来测试一些东西,然后调试代码没有按预期运行。 以下示例是用于演示我的问题的简化代码。 这是在.NET 4中使用WebApi,我试图在调试代码中打印出http请求的主体。 为此,我寻找输入流并读取流。 它第一次工作正常,但如果我再试一次,我会得到一个空字符串。 为什么我不能再次寻找和读取InputStream? 在下面的示例中,body2始终为空。 在第二个集合中,CanSeek仍然为真,第二次调用ReadToEnd()会返回一个覆盖默认值的空字符串。 using System.IO; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; public class TestController : ApiController { public class TestOutuput { public string firstRead; public string secondRead; } public HttpResponseMessage Post() { string body1 = “default for one”; string body2 = “default for two”; if (HttpContext.Current.Request.InputStream.CanSeek) { […]

动作filter中的Web Api请求内容为空

我有一个名为Log的属性,它试图将请求和响应的内容记录到文本文件中。 我把它放在我的控制器上以涵盖所有动作。 在LogAttribute中,我正在读取内容为字符串(ReadAsStringAsync),所以我不会丢失请求体。 public class LogAttribute : ActionFilterAttribute { // .. public override void OnActionExecuting(HttpActionContext actionContext) { // stuff goes here var content = actionContext.Request.Content.ReadAsStringAsync().Result; // content is always empty because request body is cleared } public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { // other stuff goes here var content = actionContext.Request.Content.ReadAsStringAsync().Result; // content is always […]

Web Api – 火与忘记

我有一个Web API的动作,我需要运行一些任务而忘记这个任务。 这就是我的方法现在的组织方式: public async Task DoSth() { await Task.Run(…); ….. //Do some other work } 事情是,显然它停在等待线等待它完成后才继续工作。 我需要“解雇并忘记”我是否应该在没有任何异步等待的情况下调用Task.Run()?

从单个WebApi方法提供多个二进制文件的最佳方法是什么?

我有一个ASP.NET MVC 4 Web Api控制器方法,它传递一个文件ID列表并返回这些文件的缩略图。 因此,客户端可能会传入一个数字ID列表(例如10,303,29),并且该方法返回一个List,其中ThumbnailImage看起来有点像这样: class ThumbnailImage { public int Id { get; set; } // Some other stuff public byte[] RawData { get; set; } } 调用者传入ID列表而不是每个项目进行一次调用的原因应该是显而易见的 – 可能要下载数十个或数百个项目,并且我正在尝试避免所需的所有HTTP流量单独下载它们。 目前,我正在使用RestSharp和JSON.NET,因此我的ThumbnailImage对象作为JSON通过网络传递。 从简单编码的角度来看,它很好,但JSON不是表示二进制数据的有效方式。 所以,我认为我应该将原始字节作为八位字节流返回…但是,虽然我可以轻松地为单个图像执行此操作,但我不确定为多个图像执行此操作的最佳方法,特别是当我还需要为每个文件返回ID和其他其他信息时。 (该ID是必需的,因为结果不一定以给定的顺序返回 – 并且某些文件可能丢失)。 我可以简单地将所有内容零碎地写入响应流中,以便为每个项目编写ID(适当编码),然后是图像数据的长度,然后是图像数据本身,然后是相同的内容下一个项目等 然后,调用者将简单地继续从流中读取,直到它耗尽为止,对ID的编码(和长度!)做出假设等。 我认为这样可行,但看起来很笨 – 有更好的方法吗?

如何从C#中的Web Api方法正确获取字节数组?

我有以下控制器方法: [HttpPost] [Route(“SomeRoute”)] public byte[] MyMethod([FromBody] string ID) { byte[] mybytearray = db.getmybytearray(ID);//working fine,returning proper result. return mybytearray; } 现在在调用方法(这也是另一个WebApi方法!)我写的像这样: private HttpClient client = new HttpClient (); private HttpResponseMessage response = new HttpResponseMessage (); byte[] mybytearray = null; response = client.GetAsync(string.Format(“api/ABC/MyMethod/{0}”, ID)).Result; if (response.IsSuccessStatusCode) { mybytearray = response.Content.ReadAsByteArrayAsync().Result;//Here is the problem } 现在,问题是MyMethod正在发送的字节数组是528字节,但是在进行ReadAsByteArrayAsync ,大小变得更大(706字节),并且值也被放大了。 有点打击我的头,任何帮助将不胜感激。 […]

调整MVC 4 WebApi XmlSerializer以丢失nameSpace

我正在开发一个MVC WebAPI,它使用EF和POCO类进行存储。 我想要做的是从XML中删除命名空间,以便端点返回并接受没有它的xml对象。 (json工作得很好) 22 testas@email.com … 我想这个工作 22 testas@email.com … 希望无需用一堆属性来装饰POCO。 我为此设置了一个测试解决方案,事实上,这些方法很受欢迎(必须是我系统中的其他一些问题)。 无论如何 – 我使用这个解决方案的结果是: 22 TestAcc Test@Test.com 摆脱了顶部的架构,但现在搞砸了属性:(这是一个示例项目的链接

在Json.NET序列化中有没有办法区分“null因为不存在”和“null因为null”?

我正在使用ASP.NET webapi代码库,我们在很大程度上依赖于通过JSON.NET自动支持将消息体的JSON反序列化为.NET对象。 作为构建我们的一个资源的补丁支持的一部分,我非常希望区分JSON对象中不存在的可选属性与明确为null的相同属性。 我的意图是使用第一个“不要改变那里有什么”与“删除这个东西”。 有没有人知道是否有可能标记我的C#DTO,这样当它们被反序列化时,JSON.NET可以告诉我它是哪种情况? 现在他们只是空出来,我不知道为什么。 相反,如果有人能够提出一个更好的设计,不需要我这样做,同时仍然支持补丁动词,我很想听听你的建议。 作为一个具体的例子,考虑将传递给put的这个有效负载: { “field1”: “my field 1”, “nested”: { “nested1”: “something”, “nested2”: “else” } } 现在,如果我只想更新field1,我应该能够将其作为HTTP补丁发送: { “field1”: “new field1 value” } 并且嵌套值将保持不变。 但是,如果我发送了这个: { “nested”: null } 我想知道这意味着我应该明确删除嵌套数据。

如何将条件必需属性放入类属性以使用WEB API?

我只想放置与WEB API一起使用的条件必需属性 例 public sealed class EmployeeModel { [Required] public int CategoryId{ get; set; } public string Email{ get; set; } // If CategoryId == 1 then it is required } 我通过( ActionFilterAttribute )使用模型状态validation

JSON中的ASP.NET Web API日期格式未成功序列化

所有, 我们正在使用ASP.NET Web API,我们有一个基于REST的服务,其中包含有效负载的JSON。 如果我将以下日期作为字符串传递,例如 sampleObj: { … myDate: “31/12/2011 00:00:00”, … } 作为JSON有效内容中的属性值,date属性被反序列化为DateTime.MinValue。 字符串格式有效吗? 我们知道格式“2012-10-17 07:45:00”成功序列化,但我们不能保证收到的所有日期都是这种格式。 有效的选择是什么?