Tag: asp.net web api

ASP.NET MVC消息处理程序与Web API消息处理程序

我创建了2个项目: 正常的,基本的ASP.NET MVC 4应用程序 基本的ASP.NET WebAPI应用程序 我做的是我添加了自定义消息处理程序,从DelegatingHandler派生到它们。 这里是: public class MyHandler : DelegatingHandler { protected override Task SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { return base.SendAsync(request, cancellationToken); } } 我在global.asax中注册了它们: GlobalConfiguration.Configuration.MessageHandlers.Add(new MyHandler()); 我给了一个断点 return base.SendAsync(request, cancellationToken); ASP.NET MVC和ASP.NET WebAPI之间的区别在于,当我调用ASP.NET MVC应用程序( http://localhost:4189/Something )时,不会触发断点 。 然而,当我调用Web API( http://localhost:7120/api/values )时, 会触发断点。 这是为什么? 那些应用程序类型执行流程有什么不同吗? 另外,当我尝试请求普通的Controller ,而不是ApiController应用程序的ApiController,如http://localhost:7120/Home , 不会触发断点。

将DateTimeOffset作为WebAPI查询字符串传递

我有一个WebAPI动作,如下所示: [Route(“api/values/{id}”)] public async Task Delete(string id, DateTimeOffset date) { //do stuff } 但是当我从HttpClient实例调用它时,创建一个类似于的URL: string.Format(“http://localhost:1234/api/values/1?date={0}”, System.Net.WebUtility.UrlEncode(DateTimeOffset.Now.ToString())); // -> “http://localhost:1234/api/values/1?date=17%2F02%2F2015+7%3A18%3A39+AM+%2B11%3A00” 我收到400响应,说不可存在的参数date不存在。 我也尝试将[FromUri]属性添加到参数中,但它仍然没有映射。 如果我将其更改为DateTimeOffset? 我可以看到它被保留为null并查看Request.RequestUri.Query值是否存在,只是没有映射。 最后我尝试不做WebUtility.UrlEncode ,它没有任何不同。

使用属性路由为Web Api构建URL视图

如何在我看来从web api获取url? 示例(来自msdn-blog ): [RoutePrefix(“reviews”)] public class ReviewsController : ApiController { // eg.: /reviews [Route] public IHttpActionResult Get() { … } // eg.: /reviews/5 [Route(“{reviewId}”)] public IHttpActionResult Show(int reviewId) { … } // eg.: /reviews/5/edit [Route(“{reviewId}/edit”)] public IHttpActionResult Edit(int reviewId) { … } } 现在我想在我的视图中构建“/ reviews / edit”,我该怎么做? 我已经尝试创建一个小扩展方法,但它要求我给每个路由一个实际的“RouteName”。 有没有我可以使用的方法(比如在MVC中)我可以通过控制器和动作? @Url.Action(“Edit”, “Reviews) 我现在使用的方法(使用RouteName)也不允许我使用整数作为参数(除非我传递一个默认值)。 如果我确实需要命名我的所有路线,我如何创建路线url,但是在我的请求的“数据”部分中传递我的参数? 目前的方法: […]

在自定义AuthorizeAttribute中访问QueryString

我正在使用Web API并设置了一个简单的身份validation和授权机制,其中调用者在查询字符串中传递我发给他们的令牌。 所以他们提交的请求如下: https://mysite.com/api/Ping?token=[issued-token] 我有一个像这样的ApiAuthorizeAttribute: public class ApiAuthorizeAttribute : System.Web.Http.AuthorizeAttribute { public ApiPermission Permission { get; set; } public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { switch (Permission) { case ApiPermission.None: return; case ApiPermission.Write: case ApiPermission.Read: string query = actionContext.Request.RequestUri.Query; var nvc = System.Web.HttpUtility.ParseQueryString(query); string token = nvc[“token”]; // (my code to map the token to an […]

为Web API 1,.net 4.0启用CORS

我需要为我的Web API启用CORS,目前我无法升级到Framework 4.5。 (我了解System.Web.Http.Cors.EnableCorsAttribute。) 我试图将以下内容添加到我的Web.config中以查看它是否有效,但它没有: 我还试图通过使用System.Web.Http.Filters.ActionFilterAttribute手动将Access-Control-Allow-Origin标头设置为“*”(基于这篇文章: 向Web API中的所有响应添加自定义标头 ) -但由于请求在进入动作过滤之前被拒绝,因此无法解决问题。 所以我现在有点卡住..任何帮助都表示赞赏。 编辑:结果 一直都是答案,我在测试之前一定做错了。 但是这个解决方案意味着所有操作都启用了CORS(现在可以使用)。

无法在Web API中正确获取文件扩展名

我在ASP.NET MVC和Angular的项目构建中使用了一个方法并检索从数据库中存储的文件而没有任何问题: [HttpPost] public ActionResult GetFile(int id) { var file= service.GetFileById(id); if (file.Data != null) { return File(file.Data, file.MimeType, file.Name); } return new EmptyResult(); } 另一方面,当我想在我的Web Api控制器中使用相同的方法时,没有这种类型的File()方法,我在查看stackoverflow上的15-20解决方案之后尝试使用以下方法: [Route(“api/Generate/{id}”)] [AcceptVerbs(“GET”, “POST”)] public HttpResponseMessage Generate(int id) { var data = service.GetFileByName(id); var stream = new MemoryStream(); var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(stream.ToArray()) }; […]

MVC4 webapi中的反序列化/模型绑定不适用于数组

我正在使用新的WebApi,它是MVC4 beta的一部分。 我有以下课程: public class Voucher { public string Id { get; set; } public string TableId { get; set; } public Product[] Products { get; set; } } 我的控制器看起来像这样: public class VouchersController : ApiController { public Voucher PostVoucher(Voucher voucher) { //…. } } 在客户端,我使用XmlSerializer序列化数据。 输出看起来像预期的那样, Products数组是序列化的。 如果我发布数据并在PostVoucher方法中放置一个断点,我会获得Id和TableId的数据,但Products为null 。 什么暗示我可能做错了什么?

Asp.Net Web API中带字典参数的方法

我需要对包含Dictionary作为参数的方法发出GET请求。 我浏览但无法找到有关如何发送字典的任何信息,所以我的请求命中我的方法。 方法签名如下所示 public void AddItems(Dictionary Items) 最好的祝福, 凯末尔

如何使用Web API Get方法返回图像

我需要使用Web API Get方法返回一个图像。 下面的代码似乎工作正常,除了我在Fiddler的ImageView窗口中收到此消息,“此响应已编码,但并未声称是图像。” public HttpResponseMessage Get() { using (FileStream fs = new FileStream(filePath, FileMode.Open)) { HttpResponseMessage response = new HttpResponseMessage(); response.Content = new StreamContent(fs); response.Content.Headers.ContentType = new MediaTypeHeaderValue(“image/jpeg”); return response; } } 我在Fiddler中也看到了与此代码相同的结果: public HttpResponseMessage Get() { HttpResponseMessage response = new HttpResponseMessage(); Byte[] b = (GetImageByteArray()); response.Content = new ByteArrayContent(b); response.Content.LoadIntoBufferAsync(b.Length).Wait(); response.Content.Headers.ContentType = new […]

Azure WebSites或Azure云服务上的MVC4 API :’System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption’

当我尝试将我的Web API项目部署到Azure上的Cloud WebSites和Cloud Hosted Services时,我收到此错误: “{“ExceptionType”:”System.TypeLoadException”,”Message”:”Could not load type ‘System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption’ from assembly ‘System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’.”,”StackTrace”:”\r\nServer stack trace: \r\n at System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)\r\n at System.Reflection.RuntimeAssembly.GetExportedTypes()\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)\r\n at System.Web.Http.WebHost.WebHostHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)\r\n at System.Web.Http.Dispatcher.HttpControllerTypeCache.InitializeCache()\r\n at System.Lazy`1.CreateValue()\r\n\r\nException rethrown at [0]: \r\n at System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)\r\n at System.Reflection.RuntimeAssembly.GetExportedTypes()\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)\r\n at System.Web.Http.WebHost.WebHostHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)\r\n at System.Web.Http.Dispatcher.HttpControllerTypeCache.InitializeCache()\r\n […]