Tag: asp.net web api2

具有路由属性的不明确控制器名称:具有相同名称和不同命名空间的控制器,用于版本控制

我正在尝试添加API版本,我的计划是为不同命名空间中的每个版本创建一个控制器。 我的项目结构如下所示(注意:每个版本没有单独的区域) Controllers | |—Version0 | | | |—– ProjectController.cs | |—– HomeController.cs | |—Version1 | |—– ProjectController.cs |—– HomeController.cs 我正在使用RoutingAttribute作为路由。 因此,Version0中的ProjectController具有路由function namespace MyProject.Controllers.Version0 { class ProjectController : BaseController { … [Route(api/users/project/getProjects/{projectId})] public async GetProjects(string projectId) { … } } } Version1中的ProjectController和具有route的函数 namespace MyProject.Controllers.Version1 { class ProjectController : BaseController { … [Route(api/v1/users/project/getProjects/{projectId})] public async GetProjects(string […]

ASP.NET标识“基于角色”的声明

我知道我可以使用声明来声明用户: var claims = new List(); claims.Add(new Claim(ClaimTypes.Name, “Peter”)); claims.Add(new Claim(ClaimTypes.Email, “peter@domain.com”)); 但是,我应该如何存储“基于角色”的声明? 例如: 用户是超级管理员。 claims.Add(new Claim(“IsSuperAdmin, “true”)); 值参数“true”感觉完全冗余。 如何使用索赔表达此陈述?

来自ASP.Net Web API 2的统一,一致的错误响应

我正在开发一个Web API 2应用程序,我正在尝试以统一的方式格式化错误重定位(这样消费者也将知道他们可以检查哪些数据对象/结构以获得有关错误的更多信息)。 这是我到目前为止所得到的: { “Errors”: [ { “ErrorType”:5003, “Message”:”Error summary here”, “DeveloperAction”:”Some more detail for API consumers (in some cases)”, “HelpUrl”:”link to the docs etc.” } ] } 这适用于应用程序本身抛出的exception(即内部控制器)。 但是,如果用户请求错误的URI(并获得404)或使用错误的动词(并获得405)等,Web Api 2会发出默认错误消息,例如 { Message: “No HTTP resource was found that matches the request URI ‘http://localhost/abc’.” } 有没有办法捕获这些类型的错误(404,405等)并将它们格式化为上面第一个例子中的错误响应? 到目前为止,我已经尝试过: 自定义ExceptionAttribute inherting ExceptionFilterAttribute 自定义ControllerActionInvoker加入ApiControllerActionInvoker IExceptionHandler (Web […]

AngularJS使用Asp.net Web API:$ http post返回XMLHttpRequest无法加载:预检的响应具有无效的HTTP状态代码405

当尝试使用$http将json POST到Asp.net Web API服务器时,它返回以下错误 XMLHttpRequest cannot load http://localhost:62158/api/video/add. Response for preflight has invalid HTTP status code 405 但是从$.ajax发出相同的请求是工作文件。 $ HTTP代码 $http.post(url, data, config) .success(function (data, status, headers, config) { defered.resolve(data); }) .error(function (data, status, header, config) { defered.reject(data); }); $ .ajax代码 $.ajax({ type: “POST”, url: url, data: newVideo, success: function (a) { debugger; }, error: […]

无法为内容类型multipart配置Web API

我正在使用Web API – Web API 2.我的基本需求是创建一个API来更新用户的配置文件。 在这里,ios和android将以multipart / form-data的forms向我发送请求。 他们会向我发送一些图像参数。 但每当我尝试创建API时,我的模型每次都变为null。 我在WebApiConfig中添加了这一行: config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(“multipart/form-data”)); 这是我的class级: public class UpdateProfileModel { public HttpPostedFileBase ProfileImage { get; set; } public string Name { get; set; } } 这是我的控制器: [Route(“api/Account/UpdateProfile”)] [HttpPost] public HttpResponseMessage UpdateProfile(UpdateProfileModel model) { } 我甚至没有在我的模型中获取参数值。 难道我做错了什么 ? 没有与此相关的答案对我有帮助。 它大约第3天,我已经尝试了几乎所有的方法。 但我无法实现它。 虽然我可以使用它,但如下所示,但这似乎不是一个好方法。 所以我避免它.. var httpRequest = HttpContext.Current.Request; […]

我应该在哪里插入我的自定义DefaultContractResolver JSON.NET?

我在ASP.Net中有一个WebAPI 2.0项目,我在其中实现了一个自定义的DefaultContractResolver,这样我就可以控制我的实体如何使用JSON.Net序列化为JSON; 但我不确定如何告诉框架使用我的自定义实现。 我还想知道是否可以为特定的控制器/操作更改ContractResolver。 谢谢! —编辑03/07/2014我已经通过创建一个新的ConfigSettings对象并手动解析对象,已经找到了如何使用我的自定义实现; 但是,生成的JSON被序列化两次(它有额外的\ r \ n字符)。 这是因为webAPI控制器默认序列化响应,所以我想更改以覆盖该行为……这是正确的方法吗?

如何在aspnet.core web api中validationJWT令牌?

我创建了自定义中间件类来validationJWT令牌。 我在configure方法中的app.AddMvc()之前调用此方法。 *** 我想知道我应该添加哪些东西来配置服务来使用JWTvalidation我的Web API? 我在Controller类中添加了[Authorize] 我是否需要调用我的中间件类,它首先在Configure方法中validationJWT令牌? 或者我应该调用App.UseAuthentication()我使用以下顺序: app.UseAuthentication(); app.MessageHandlerMiddleware(); app.UseMvc(); 我是.net web API实现的新手。 你能帮帮我吗?

如何防止单个对象属性在字符串时转换为DateTime

这是我必须使用的模型的简化版本: class InputModel { public string Name { get; set; } public object Value { get; set; } } 以及控制器的相关部分: class Controller : ApiController { [HttpPut] public async Task Update([FromBody]InputModel model) { //implementation } } InputModel类的Value属性可以是任何类型,它将在以后知道的类型中,在模型发送到的一段遗留代码中,我无法控制。 我在请求正文中使用以下json发生的问题: { “name”: “X”, “value”: “2001-10-17T13:55:11.123” } 默认行为是解析此json,以便将Value属性转换为DateTime。 但是,DateTimes的处理方式与遗留代码中的字符串截然不同,并且在处理后数据会丢失(例如:在持久保存到数据库时删除毫秒部分)。 因此,当稍后请求相同的值时,返回的值为“2001-10-17T13:55:11”(缺少毫秒)。 当然我可以通过在我的web api配置中全局设置来解决这个问题: httpConfiguration.Formatters.JsonFormatter.SerializationSettings.DateParseHandling = DateParseHandling.None; 但这样做也会禁用解析DateTimes以用于其他方法和控制器中的模型,这些方法和控制器具有需要默认行为的模型。 我正在寻找的是类似下面的(想象的)代码: class InputModel […]

查询参数路由约束

我刚开始使用ASP.NET Web API 2.1并遇到了限制。 使用属性路由,我可以执行以下操作: [Route(“item/{id:int}”)] public IHttpActionResult GetItem(int id) { … } URL /item/5将路由到此操作,但由于{id:int}中的int约束,URL /item/abc将不会。 我尝试更改我的URL,以便id参数在查询字符串及其约束中,尽管在文档中从未提及或演示过查询参数的路径约束。 [Route(“item?{id:int}”)] public IHttpActionResult GetItem(int id) { … } 如果我现在尝试运行,我在Application_Start的Configure方法调用上出错。 protected void Application_Start() { GlobalConfiguration.Configure(WebApiConfig.Register); } 消息如下。 ArgumentException未被用户代码处理 路径模板不能以’/’或’〜’字符开头,也不能包含’?’ 字符。 有两件事让我烦恼不已。 首先, 记录 MSDN 上路由前缀的部分清楚地表明,在路径模板的开头放置一个~字符是完全可以接受的。 我试过了,它的工作原理记录在案。 其次,如果不是这样,我如何在查询参数上放置路由约束? 考虑以下情况,删除路径约束。 [Route(“item”)] public IHttpActionResult GetItem(int id) { … } URL /item/5将路由到此操作, id设置为5 […]

dependency injection无法与Owin自托管Web Api 2和Autofac一起使用

我正在寻找Web Api 2,Owin和Autofac,并需要一些指导。 概观 我有一个Owin自托管的Web Api,它使用Autofac进行IoC和dependency injection。 该项目是一个控制台应用程序,就像一个服务,这意味着它可以停止和启动。 我有一个带有两个构造函数的身份validation控制器:一个参数少,另一个注入存储库。 问题 当我运行服务并调用api时,我的无参数构造函数被调用,我的存储库永远不会被注入(_repository = null)。 研究 我已经做了一些研究,并在Github上发现了一些有用的项目,我将其复制到了发球台,但我错过了很大一部分难题。 这很有帮助,但没有解决我的问题。 我在Stack Overflow上阅读了这个问题 ,Dane Sparza有一个很好的演示项目,但我找不到一个明确的解决方案。 问题不是自托管而是dependency injection。 我的代码 (细化了解释) public class Startup { public void Configuration(IAppBuilder app) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: “DefaultApi”, routeTemplate: “api/{controller}/{id}”, defaults: new { id = RouteParameter.Optional } ); var json = config.Formatters.JsonFormatter; […]