Tag: asp.net web api

任何人都可以使用示例客户端应用程序解释IExceptionHandler的工作流程

我在本示例中面临以下问题: 我无法在ExceptionContext找到IsOutermostCatchBlock 如果发生exception,则此HandleAsync方法正在执行两次。 ( http://www.asp.net/web-api/overview/web-api-routing-and-actions/web-api-global-error-handling ) public class CustomExceptionHandler : IExceptionHandler { public virtual Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) { if (!ShouldHandle(context)) { return Task.FromResult(0); } return HandleAsyncCore(context, cancellationToken); } public virtual Task HandleAsyncCore(ExceptionHandlerContext context, CancellationToken cancellationToken) { HandleCore(context); return Task.FromResult(0); } public virtual void HandleCore(ExceptionHandlerContext context) { } public virtual bool ShouldHandle(ExceptionHandlerContext context) { […]

仅为路由公开.NET OData API的子集(对于排除的API,返回404)

背景/环境: 我们有两条路线,路线前缀不同: 路由1前缀: /api 路由2前缀: /api/partial 目前,我们对两个路由前缀使用相同的EdmModel。 (参见第一个代码snippit,名为“我们目前正在做什么”)。 我们想要什么: 我们只需要为Route 2允许APIfunction的子集: /api/partial 。 当有人试图访问“部分”EdmModel不可用的API时,我们希望返回404 例: 我们想为/api/parial/products返回404 ,其中products未在此“部分”API路径中定义。 我们仍希望将/api/products路由到控制器方法 我们尝试过的: 使用第二个EdmModel,它只包含完整EdmModel中可用实体的子集。 (参见第二个代码snippit,名为“我们想做什么:”。) 问题: 我们在服务启动时收到错误: The path template ‘products’ on the action ‘Export’ in controller ‘Products’ is not a valid OData path template. Resource not found for the segment ‘products’.) The path template ‘products’ on the action […]

为什么CastleWindsor的BeginScope超出范围?

我正在尝试将Castle Windsor添加到我的Web API项目中,并且正在关注此post ,但是在这行代码中遇到编译时错误: this._scope = container.BeginScope(); …作为“ ‘Castle.Windsor.IWindsorContainer’不包含’BeginScope’的定义,并且没有扩展方法’BeginScope’接受类型’Castle.Windsor.IWindsorContainer’的第一个参数可以找到(你是否错过了使用指令或汇编参考?) “ 这是整个代码,因此可以在上下文中看到: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http.Dependencies; using Castle.Windsor; using Castle.MicroKernel.Registration; using System.Web.Http; namespace PlatypiPieServer { public class WindsorDependencyResolver : IDependencyResolver { private readonly IWindsorContainer _container; public WindsorDependencyResolver(IWindsorContainer container) { _container = container; } public IDependencyScope BeginScope() { return new WindsorDependencyScope(_container); […]

使用ASP.NET Web API将表单yyyy-MM-dd的日期查询参数反序列化为noda time LocalDate对象

我正在调查使用NodaTime LocalDate来替换我们现有的BCL DateTime / DateTimeOffset类的使用。 由于我们对DateTime可论证的模糊行为的误解,我们在代码中遇到了许多与时区相关的问题。 为了充分利用NodaTime,我希望能够从YYYY-MM-DDforms的ASP.NET Web API 2 Web服务发送和接收日期。 我已成功将LocalDate正确序列化为YYYY-MM-DD。 但是,我无法将日期查询参数反序列化为LocalDate。 LocateDate始终是1970-01-01。 这是我当前的原型代码(为清晰起见,删除了一些代码): PeopleController.cs [RoutePrefix(“api”)] public class PeopleController : ApiController { [Route(“people”)] public LocalDate GetPeopleByBirthday([FromUri]LocalDate birthday) { return birthday; } } 的Global.asax.cs public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { // Web API configuration and services var formatters = GlobalConfiguration.Configuration.Formatters; var […]

无法使用Unity引导程序为ASP.NET Web API nuget包注入System.Web.Http.Filters.ActionFilterAttribute

我无法使用Unity Web API API nuget包的Unity引导程序使用自定义ActionFilterAttribute类进行dependency injection。 我在UnityConfig中注册了这个类型,我在其他地方使用它(虽然使用构造函数注入)但它工作正常。 public static void RegisterTypes(IUnityContainer container) { container.RegisterType(); … } 代码被成功调用,但实例化对象(settingService)为null。 public class APIKeyValidationAttribute : ActionFilterAttribute { [Dependency] public ISettingService settingService { get; set; } public override void OnActionExecuting(HttpActionContext actionContext) { … if (settingService == null) { throw new Exception(“settingService is null”); } … } 为了让这个工作,我需要做什么? 我已经搜索了很长时间,只能找到MVC或具有不同dependency injection器的Web API的示例。

WebApi,Autofac,System.Web.Http.Filters.ActionFilterAttribute每个请求的实例

我们已经在我们的应用程序(现在的MVC 4)中使用了Autofac很长一段时间,我们在基本控制器上有很多属性,一切都是inheritance的,并且一切正常,所以当请求开始时我们的服务被创建然后通过所有属性和控制器操作。 我们现在正在查看WebApi并创建了我们的WebApi控制器,并使用HTTP命名空间中的ActionFilterAttribute在基本控制器上创建了一个属性。 但是问题从这里开始,在属性上的属性上注入的服务与ApiController上的服务不同。 查看下面的链接,这似乎是已知的ASP.NET Web API和请求范围中的依赖项 然而,这里的解决方案并不理想,因为我们不希望我们的控制器知道dependency injection,我们只想使用我们注入属性的服务并知道它是每个请求一个实例。 我们称之为: builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 和 GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 我们的课程目前在Autofac注册为InstancePerLifetimeScope,我们想要的是能够为MvcControllers和ApiControllers提供每个请求。 那可能吗? 编辑: 所以基本上这行为请求返回正确的服务(即同样在ApiController上的实例) var service = actionContext.Request.GetDependencyScope().GetService(typeof(IOurService); 但是ActionFilterAttribute上的属性注入实例是不一样的,如果我将Autofac注册更改为InstancePerApiRequest,我会收到以下错误: “从请求实例的范围中看不到具有匹配’AutofacWebRequest’的标记的范围。这通常表示SingleInstance()组件(或类似方案)正在请求按HTTP请求注册的组件。在Web集成下,总是从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖,永远不要从容器本身请求。“

来自URI的Web API ModelBinding

所以我有一个为DateTime类型实现的自定义Model Binder,我将其注册如下: void Application_Start(object sender, EventArgs e) { // Code that runs on application startup GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI()); } 然后我设置了2个示例操作以查看我的自定义模型绑定是否发生: [HttpGet] public void BindDateTime([FromUri]DateTime datetime) { //http://localhost:26171/web/api/BindDateTime?datetime=09/12/2014 } [HttpGet] public void BindModel([FromUri]User user) { //http://localhost:26171/web/api/BindModel?Name=ibrahim&JoinDate=09/12/2014 } 当我运行并调用上述URL中的两个操作时, user的JoinDate属性使用我配置的自定义绑定器成功绑定,但BindDateTime的datetime参数不会使用自定义绑定器绑定。 我已经在config中指定所有DateTime应该使用我的自定义绑定器然后为什么冷漠? 建议非常感谢。 CurrentCultureDateTimeAPI.cs: public class CurrentCultureDateTimeAPI: IModelBinder { public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { var value […]

api控制器的文件下载问题

public class DefaultController : Controller { // GET: Default public ActionResult Index() { return Download(); } public FileResult Download() { string xmlString = “my test xml data”; string fileName = “test” + “.xml”; return File(Encoding.UTF8.GetBytes(xmlString), “application/xml”, fileName); } } 我在asp.net mvc应用程序中有上面的代码来下载文件。 它工作正常,因为我的控制器inheritance到Controller。 但是当我将此代码移动到Webapi控制器时,它会在返回File时抛出错误。 经过分析,我发现webapi中的控制器inheritance到ApiController(system.web.http.api控制器)。 我发现ApiController中没有File类。 有没有选项在webapi控制器中实现下载文件function? 我在webapi控制器中尝试了下面的替代代码,但是一旦我调用它就看不到下载文件。 public HttpResponseMessage DownloadConstructedXmlFile() { var result = new […]

如何将OAuth2.0与OData客户端代码生成器集成?

我开发了一个实现OAuth2.0和OData的WebApi。 现在我正在建立一个客户端来测试我到目前为止所实现的内容。 我使用OData客户端代码生成器为OData生成了模板,但是如何在OData请求中引入de访问令牌? 知道如何扩展OData模板以引入OAuth2.0方案吗? 或者更简单的方法,如何在每个OData请求中引入OAuth访问令牌? UPDATE static void Main(string[] args) { var container = new Default.Container(new Uri(baseurl)); TokenResponse accessToken = null; try { accessToken = GetToken(); } catch (Exception ex) { Console.WriteLine(“Can’t do nothing without an access token…”); return; } //I want to introduce in every request the following information: //Basic autentication header with cliendId […]

使Web API身份validation返回401而不是重定向到登录页面

我在Web MVC中使用带有OWIN身份validation的Web API。 我在Web.Config中使用为我的Web MVC,所以它重定向到登录页面。 我正在使用[System.Web.Http.Authorize]属性来授权我的Web API。 但不知何故,由于上述配置,API重定向到登录页面,就像我的MVC应用程序一样。 我想要做的是保持重定向Web MVC的function,但返回401 for Web API。 我怎样才能做到这一点? 我应该为Web API创建自定义授权属性吗? – 编辑 – 我发现WebApi.Owin中这篇文章中的SuppressDefaultHostAuthentication的答案也抑制了webapi之外的身份validation 所以我只需在Startup.cs添加几行代码。 我的所有控制器都配置了“api”前缀路由。 HttpConfiguration config = new HttpConfiguration(); //..some OWIN configuration app.Map(“/api”, inner => { inner.UseWebApi(config); }); 确保在Web Api配置行之后放置app.Map() 。 否则,它将给MVC应用程序带来错误。