Tag: asp.net web api

WebAPI 2属性路由,区域不起作用

我无法使WEBAPI 2属性路由工作。 我正在寻找的路由方案是/api/{product}/{controller}/{id-optional} ,所以就像/api/Vision/IdCard 。 控制器位于一个区域中,并设置如下: namespace DataServices.Controllers.Vision { [RoutePrefix(“api/vision”)] public class IdCardController : BaseApiController { [System.Web.Mvc.RequireHttps] [Route(“idcard”)] public IdCardViewModel Get(HttpRequestMessage request) {…} 每当我做到这一点,我得到一个404 。 我包含了命名空间,因为该区域位于其自己的命名空间中。 WEBAPI属性路由中是否支持区域? 编辑:WebApiConfig看起来像这样: config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: “DefaultApi”, routeTemplate: “api/{controller}/{id}”, defaults: new { id = RouteParameter.Optional } );

POST StreamContent与多个文件

下面的代码片段成功地将单个文件HttpPost到WebAPI。 我想扩展它以构建包含多个文件的StreamContent(类似于Fiddler多文件post)。 我知道我应该为StreamContent添加一个“边界”,但我不确定究竟在哪里。 我想最终将FileStream / Stream参数转换为List,这样我就可以遍历集合并将StreamContent构建为POST。 如果这篇文章有任何意义,请告诉我。 我很感激任何建议。 提前致谢! public async Task UploadOrderFile(FileStream imageFileStream, string filename, string contentType = “image/png”) { JsonApiClient._client.DefaultRequestHeaders.Clear(); var content = new MultipartFormDataContent { JsonApiClient.CreateFileContent(imageFileStream, filename, contentType) }; JsonApiClient._client.DefaultRequestHeaders.Add(“Authorization”, ” Bearer ” + JsonApiClient.Token.AccessToken); var response = await JsonApiClient._client.PostAsync(“api/UploadFile”, content); response.EnsureSuccessStatusCode(); return response.StatusCode; } internal static StreamContent CreateFileContent(Stream stream, string fileName, […]

保护我的代码免受Newtonsoft JSON的侵害

我正在构建一个教科书.NET WebAPI Web服务,在最简单的情况下,它应该接收一个GET请求并返回一个JSON对象数组。 但是该项目还加载了NewtonsoftJSON nuget包,显然该包重新定义了ApiController类,因此它的Json()方法具有不同的声明。 最终结果是我得到以下编译时错误: 如何保护我的控制器声明不被Newtonsoft重新定义? public class ImmediateInformationController : ApiController { public JsonResult Get([FromUri] ImmediateInformation ii) { // some code here return this.Json(iil, JsonRequestBehavior.AllowGet); } } 一点背景:最初我只返回iil ,但在浏览器中测试时,它提示下载包含我需要的JSON的ImmediateInformation.json文件。 以上是尝试将JSON作为纯文本返回,这使我发现当参数类型与MSDN文档不匹配时,Newtonsoft重新定义了ApiController 。 重新上限:问题只是使用JSON下载问题来说明我在做什么。 我如何确保当我声明控制器类是ApiController的后代时,它是Microsoft的API控制器,而不是Newtonsoft的?

ASP.NET Web API:如果从资源设置错误消息,则模型有效

问题是在ApiController中,如果我使用.rsx文件(参考资料)提供自定义错误消息,则ModelState.IsValid始终为true 。 这是我的模型: public class LoginModel { public string Email { get; set; } [Required] [MinLength(5)] public string Password { get; set; } } ApiController中的方法: [HttpPost] [ModelValidationFilter] public void Post(LoginModel model) { var a = ModelState.IsValid; } filter: public class ModelValidationFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid == false) { […]

为什么要处理ASP.NET Web Api的依赖性解析器?

我有一个自定义IDependencyResolver : internal class NinjectResolver : IDependencyResolver { private IKernel _kernel; internal NinjectResolver(params ApplicationModule[] modules) { _kernel = new StandardKernel(modules); } public IDependencyScope BeginScope() { return this; } public object GetService(Type serviceType) { return _kernel.TryGet(serviceType); } public IEnumerable GetServices(Type serviceType) { return _kernel.GetAll(serviceType); } protected void Dispose(bool disposing) { if(disposing) { if(_kernel != null && […]

基于角色的安全性在breezejs和EF6中

我在一个具有3个主要安全角色的项目中使用Breeze.js,AngularJS,Web API和EF6。 让我们说高级,中级和低级。 在这些示例中,我有Person,Company,LowLevelSecret,MediumLevelSecret,HighLevelSecret实体。 安全问题1:在第一个示例中,我希望能够保护对整个实体的访问。 所有安全角色(低级别,中级别和高级别)都应该能够访问Person实体。 只有具有匹配级别或更高级别的用户才能访问保存特权信息的秘密实体。 例如我可能有。 class Person { public int Id { get; set; } public string Name { get; set; } public LowLevelSecret LowLevelSecret { get; set; } public MediumLevelSecret MediumLevelSecret { get; set; } public HighLevelSecret HighLevelSecret { get; set; } } LowLevelSecret,MediumLevelSecret和HighLevelSecret看起来像这样: class LowLevelSecret { public int Id { […]

如何在Web请求上传输CancellationToken

我正在做一些关于通过WebAPI取消异步请求的研究, 最近我发现最新版本的WebApi(不是.NET-Core)支持取消令牌。 作为测试我写了这段代码。 [HttpGet] [Route(“LongRequest”)] public async Task VeryLongRequest(string Key, CancellationToken token) { for (int i = 0; i < 5; ++i) { if (false == token.IsCancellationRequested) { Thread.Sleep(5000); } else { Trace.WriteLine("Cancelled"); } } return "Complete"; } 当用户关闭窗口/刷新/或导航到新页面(不在SPA上)时,此代码有效,并且更新取消令牌。 因为HTTP请求是无状态的,取消映射如何回到请求? 我怎样才能从我的客户手动调用取消?

如何在IAuthenticationFilter实现中设置WWW-Authentication标头?

我正在使用MVC5的IAuthenticationFilter接口实现基本身份validation。 我的理解是,现在这是首选方法,而不是使用DelegatingHandler。 我已经开始工作,但响应中没有返回www-authenticate标头。 这是我对ChallengeAsync的实现: public async Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { var result = await context.Result.ExecuteAsync(cancellationToken); if (result.StatusCode == HttpStatusCode.Unauthorized) { result.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(“Basic”, “realm=localhost”)); } } 如果我在AuthenticateAsync中设置它,则会返回标头,但我认为我应该在ChallengeAsync中设置它。 示例实现很难找到。

ApiController操作无法从查询字符串解析数组

使用Visual Studio 2012.2,MVC4 Web应用程序。 我有这样的请求来到我的ApiController: http://localhost/api/keys?ids[]=1&ids[]=2&ids[]=3 我的印象是以下方法应该能够自动从ids []数组中检索值: public KeysModel Get(int[] ids){…} 但是,当出现上述请求时,“ids”参数的值为null。 我已经检查过HttpContext.Current.Request.QueryString有ids的值,我可以这样对待它们,但这会使unit testing变得更难。 我也尝试使用List ids,[FromUri],[FromUri(Name =“ids []”)],对象id和字符串id(有趣的是,当ids是一个字符串变量时,其中的值是“ (采集)”

如何在HttpClient response.ReasonPhrase中获取真正的错误消息?

我的设定 我有2个WebApi项目,具有以下流程: 用户向API 1发出请求 API 1代表用户向API 2发出请求(使用HttpClient )。 using (var client = new HttpClient()) { client.SetBearerToken(token); string endpoint = PbbSettings.Identity.Users.Delete.Replace(“{userId}”, userId); // Attempt deletion of the user using (var response = await client.DeleteAsync(endpoint)) { // Throw exception if not succeeded EnsureSuccess(response); } } 问题 所以控制和信息的流动很好。 问题是当API 2响应错误时, response.ReasonPhrase “Bad Request”或“Internal Server Error”,而不是我在exception中设置的消息。 现在已经整整一天吐血了。 任何见解? 更多信息(TLDR) […]