Articles of asp.net web api

路由和消息处理程序:请求处理订单问题

我遇到了ASP.NET Web API请求管道的执行顺序问题。 根据ASP.NET Web API文档( 此处提供 ),全局消息处理程序应该在路由机制之前执行。 在此图像上, MessageHandler1是全局消息处理程序,而MessageHandler2特定于Route 2 。 我创建了一个非常简单的例子来表明执行顺序中似乎存在问题……或者我真的错过了一些重要的事情。 我有这个控制器 public class FooController : ApiController { [HttpPut] public string PutMe() { return Request.Method.Method; } } 它只接受PUT请求。 应用程序配置如下: protected void Application_Start() { var configuration = GlobalConfiguration.Configuration; configuration.MessageHandlers.Add( new SimpleMethodOverrideHandler() ); configuration.Configuration.Routes.MapHttpRoute( name: “Foo”, routeTemplate: “api/foo”, defaults: new { controller = “foo”, action […]

在OData WebApi Url中传递参数

使用Web Api我有一个OData EndPoint,可以从数据库返回产品。 我有多个具有相似模式的数据库,并希望在URL中传递一个参数来识别Api应该使用哪个数据库。 当前的Odata终点: HTTP://本地主机:62999 /产品 我想要的是: http:// localhost:62999/999 /产品 在新的Url中,我传入了999(数据库ID)。 数据库ID用于指定从中加载产品的数据库。 例如localhost:62999/999/Products(‘ABC123′)将从数据库999加载产品’ABC123’,但是下一个请求localhost:62999/111/Products(‘XYZ789′)将从数据库加载产品’XYZ789′ 111。 下面的Url有效,但我不喜欢它。 localhost:62999/Products(‘XYZ789’)?database=111 这是控制器的代码: public class ProductsController : ErpApiController //extends ODataController, handles disposing of database resources { public ProductsController(IErpService erpService) : base(erpService) { } [EnableQuery(PageSize = 50)] public IQueryable Get(ODataQueryOptions queryOptions) { return ErpService.Products(queryOptions); } [EnableQuery] public SingleResult Get([FromODataUri] string key, […]

ASP.NET Core Identity不会注入UserManager

我有一个较旧的asp.net核心身份数据库,我想将一个新项目(一个web api)映射到它。 仅仅为了测试,我复制了Models文件夹,以及上一个项目中的ApplicationUser文件(ApplicationUser只是inheritance自IdentityUser,无论如何都没有变化) – 首先做数据库似乎是一个坏主意。 我在ConfigureServices中注册了Identity(但是我没有将它添加到管道中,因为我的唯一目的是使用UserStore) services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders(); 我的期望是现在 UserManager ……应该自动注入构造函数中。 但是,将以下代码添加到控制器私有UserManager _userManager时; public UserController(UserManager userManager) { _userManager = userManager; } …每次调用api都会以exception结束:HttpRequestException:响应状态代码不表示成功:500(内部服务器错误)。 删除“注入”代码可以顺利运行可以接受请求的web api。 在我的任何代码到达之前发生这种情况很难调试。 知道为什么会这样吗? PS从“exception设置”窗口启用所有exception后,我得到了这个: 抛出exception:’System.InvalidOperationException’ Microsoft.Extensions.DependencyInjection.dll 附加信息:尝试激活’Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [Namespace.Models]时,无法解析类型’Namespace.Data.ApplicationDbContext’的服务。 ApplicationUser,Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole,Namespace.Data.ApplicationDbContext,System.String]”。

WebAPI CORS和Ninject

我有一个具有ninject的ac #WebAPI项目,所有的get函数都在工作。 但是,每当我尝试发布时,我都会从api获得“Method Not Allowed”响应。 我已经阅读了一些地方,这是因为当api拒绝交叉来源呼叫时。 所以我使用了包管理器控制台并安装了Microsoft.AspNet.WebApi.Cors nugent包,并按照文章http://www.asp.net/web-api/overview/security/enabling-cross-origin的说明进行操作。 -requests-in-web-api 。 我的问题是现在Ninject不工作但抛出以下内容:尝试通过方法’System.Web.Http.GlobalConfiguration..cctor()’来访问字段’System.Web.Http.GlobalConfiguration.CS $ 9__CachedAnonymousMethodDelegate2’失败。“} 有人能帮我一下吗? 抛出错误的行是:System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel); Ninject配置文件 public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// /// Starts the application /// public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); bootstrapper.Initialize(CreateKernel); } /// /// Stops the application. /// public static […]

ASP.net MVC 4 WebApi – 测试MIME多部分内容

我有一个ASP.net MVC 4(beta)WebApi,看起来像这样: public void Post() { if (!Request.Content.IsMimeMultipartContent(“form-data”)) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } IEnumerable parts = Request.Content.ReadAsMultipartAsync().Result; // Rest of code here. } 我试图对这段代码进行unit testing,但无法解决如何做到这一点。 我在这里走在正确的轨道上吗? [TestMethod] public void Post_Test() { MultipartFormDataContent content = new MultipartFormDataContent(); content.Add(new StringContent(“bar”), “foo”); this.controller.Request = new HttpRequestMessage(); this.controller.Request.Content = content; this.controller.Post(); } 此代码抛出以下exception: System.AggregateException:发生一个或多个错误。 —> System.IO.IOException:MIME多部分流的意外结束。 MIME多部分消息未完成。 System.Net.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http.Http。 […]

GZip标头中的幻数不正确。 确保传入GZip流

我正在尝试使用WebAPI从EntityFramework中检索产品名称及其ID作为NameID对象。 代码如下。 public class ProductController : ApiController { protected MainDataContext db = new MainDataContext(); // GET /api/values public IQueryable Get() { return db.Products.Select(x=>new NameID{ ID=x.ID,Name=x.Name }).AsQueryable(); } // GET /api/values/5 public NameID Get(long id) { var result = db.Products.Select(x=>new NameID{ ID=x.ID,Name=x.Name }).SingleOrDefault(x => x.ID == id); if (id == 0 || result == null) throw […]

如何阻止HttpClient.GetAsync(uri)挂起?

我有以下代码用于调用uri: var uri = string.Format(“Helpers/ProfileList/Online/?locationId=0&skip=0&take={0}”, numProfiles); HttpResponseMessage response = await client.GetAsync(uri); response.EnsureSuccessStatusCode(); uri指向一个自定义的web api uri(我可以调试并完成)。 但是,当调用api中的最后一个return语句时,似乎什么也没发生。 它应该转到response.EnsureSuccessStatusCode(); 线,但事实并非如此。 它似乎挂了。

所有Entity Framework方法都应该使用异步吗?

在Asp.Net MVC或Asp.Net Web API中,使用查询数据库(即使是最简单的查询)的每个控制器操作都使用async / await模式是不错的做法? 我知道使用async / await会增加复杂性,但是添加它值得吗? 即使是最简单的查询?

从catch块向客户端发送格式化的错误消息

我使用以下代码从filter(ActionFilterAttribute)向客户端发送错误消息。 catch (Exception) { var response = context.Request.CreateResponse(httpStatusCode.Unauthorized); response.Content = new StringContent(“User with api key is not valid”); context.Response = response; } 但问题是它只以纯文本forms发出。 我想将其作为当前格式化程序的格式发送。 像json或xml的forms。 在这里我知道这是因为我正在使用StringContent()。 但是我们如何使用自定义Error对象编写? 比如,以下不起作用: response.Content = new Error({Message = “User with api key is not valid”}); 我们如何为此编写代码? 提前致谢。

处理同一设备的azure通知中心中的重复条目

我在我的应用程序中使用Windows azure通知集线器向用户提供通知。 以下是在通知中心上注册设备的API代码。 var platform = registrationCall[“platform”].ToString(); var installationId = registrationCall[“instId”].ToString(); var channelUri = registrationCall[“channelUri”] != null ? registrationCall[“channelUri”].ToString() : null; var deviceToken = registrationCall[“deviceToken”] != null ? registrationCall[“deviceToken”].ToString() : null; string RegistrationID = registrationCall[“RegistrationID”] != null ? registrationCall[“RegistrationID”].ToString() : null; var userName = HttpContext.Current.User.Identity.Name; RegistrationDescription registration = null; AppleRegistrationDescription iosExistingRegistrationByDeviceToken = null; string UserID […]