Tag: asp.net web api2

如何使用HttpClient从特定IP地址发送请求? C#

我在服务器上有多个IP,并希望在使用HttpClient类从API获取/发布数据时选择我想要使用的IP。 (或甚至同时发送请求但使用2个IP而不仅仅是一个) 我已经看到一些使用HttpWebRequest( 这里 )的例子,它使用了委托,但我想继续使用HttpClient实现。

C#unit testingAPI 2调用

我有一个web api 2 web服务获取方法。 我正在使用HttpContext.Current.Request.UserHostAddress。 当直接调用我的控制器方法时,他没有填充unit testing,因此是null对象的错误。 所以我搜索了如何填写这个并找到以下有助于解决该问题: 为HttpRequestMessage添加IP地址 但是,这需要服务器名称来发送请求。 问题是,当测试运行时,VSExpress将需要为此API Web服务运行,而在运行测试时则不会。 最重要的是,即使它似乎它选择一个随机端口运行,所以我不能像在上面的链接中那样对地址进行硬编码。 鉴于上述问题,我如何测试我的api 2方法? 这是我在测试api方法时爆炸的线 string ip = HttpContext.Current.Request.UserHostAddress; [编辑]答案 所以每个人都知道这是代码中的解决方案 public class MyController : ApiController { private: HttpRequestBase httpRequest; public MyController() { httpRequest = new HttpRequestWrapper(HttpContext.Current.Request) } public MyController(HttpRequestBase http) { httpRequest = http; } public HttpResponseMessage Get() { string ip = httpRequest.UserHostAddress; […]

解析WebAPI中的接口

我有一个带有以下签名的控制器方法 [HttpGet] [Route(“results”)] public List GetResults() { return repo.GetResults(); } 毫不奇怪,我得到一个JSON .NETexception,说JSON .NET无法将IResult解析为具体类型。 有没有办法为JSON .NET提供具体的类(Result),所以我不必更改方法的单一性?

在asp.net Web Api中处理未经身份validation的请求的最佳方法

我有一个带有Web Api 2的标准VS2013 MVC5项目。 标准项目的设计方式,如果请求未经过身份validation, [Authorize]属性只返回401状态代码,而完全独立的模块会嗅探任何401代码,暂停它们,而是将302重定向发送到登录页面在Startup.Auth.cs文件中指定。 这对于Mvc控制器来说没问题,但是对于Web Api控制器来说真的很糟糕,因为例如浏览器会自动将ajax请求重定向到登录URL,所以即使响应文本只是登录页面的html,你最终也会得到200OK状态。 这使得编写良好的javascript变得很困难,可以区分您只需要告诉用户重新登录的情况与其他类型的错误。 理想情况下,我们应该能够根据状态代码判断,但javascript永远不会看到401状态。 处理这个问题的最佳方法是什么? 我的第一个想法是写一个授权属性,但使用状态代码403而不是401: public class ApiAuthorizationAttribute : System.Web.Http.AuthorizeAttribute { public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { if (actionContext.RequestContext.Principal.Identity.IsAuthenticated) { base.OnAuthorization(actionContext); } else { actionContext.Response = actionContext.ControllerContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, “Not signed in.”); } } } 当然, 规范明确声明403是不正确的: 授权无效,请求不应重复 我的另一个想法是,也许我应该完全禁用asp.net的401重定向模块并处理自定义授权属性中的重定向,因为即使对于Mvc视图也很糟糕,因为它不允许您重定向到不同的登录页面,具体取决于用户试图访问的网站。 还有其他更好的方法来处理这个吗?

同步操作场景中的ExceptionFilter堆栈跟踪

我在Controller中有一个简单的同步动作,它抛出一个exception,如下所示: [RoutePrefix(“”)] public class MyController : ApiController { [Route(“”)] public HttpResponseMessage Get() { throw new Exception(“whatever”); return Request.CreateResponse(HttpStatusCode.OK, “response”); } } 我还有一个ExceptionFilterAttribute来获取应用程序中发生的exception public class MyExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionContext) { var ex = actionContext.Exception; // Log ex, etc. } } 一切正常,因为我确实在MyExceptionFilterAttribute获得了exception。 问题是堆栈跟踪。 这是它的样子: at System.Web.Http.Filters.ActionFilterAttribute.d__1.MoveNext() — End of stack trace from […]

从Web Api请求获取自定义validation错误消息到HttpClient

我的ASP.NET Web Api 2服务有以下模型: public class Message { public int Id { get; set; } [Required] [StringLength(10, ErrorMessage = “Message is too long; 10 characters max.”)] public string Text { get; set; } } 我正在从我的WinForms应用程序发出请求: using (var client = new HttpClient()) { client.BaseAddress = new Uri(BaseAddress); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); var messageOverTenCharacters = new Message { […]

每个appdomain的webapi和未处理的exception挂钩

拥有WebApi 2.2应用程序 – 是否可以使用AppDomain的UnhandledException钩子? 我有一个类似于这样的代码: [assembly: OwinStartup(“DevConfiguration”, typeof(DevStartup))] namespace WebApi.Module { public class DevStartup { private const string ErrorEventSourceName = “WebApiHost”; private const int ErrorEventId = 600; [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)] public void Configuration(IAppBuilder app) { AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException; … throw new Exception(“some exception); } public static void AppDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e) { EventLog.WriteEntry(ErrorEventSourceName, ex.ToString(),EventLogEntryType.Error, ErrorEventId); } […]

Web API路由 – 重载的GET方法导致其他动词不允许405方法

我有一个API控制器,支持用户对象的DELETE,GET,POST和PUT操作。 GET-one操作可以通过其ID来检索用户帐户。 但我也想通过他们的UserName获取用户。 我为每个创建了单独的方法,它似乎工作正常,因为我可以通过两种方式获得预期的数据。 // GET: api/UserAccounts/5 [HttpGet] [ResponseType(typeof(UserAccount))] [Route(“~/api/UserAccounts/{id:int}”)] public async Task GetUserAccount(int id) { … } // GET: api/UserAccounts/JohnDoe [HttpGet] [ResponseType(typeof(UserAccount))] [Route(“~/api/UserAccounts/{userName}”)] public async Task GetUserAccount(string userName) { … } // DELETE: api/UseAccounts/5 [HttpDelete] [ResponseType(typeof(UserAccount))] public async Task DeleteUserAccount(int id) { … } // GET: api/UserAccounts [HttpGet] public IQueryable GetUserAccounts() { … } […]

Web Api 2.2 – 类库项目中的代码优先迁移

我在myVS 2015解决方案中有两个项目。 项目A. Web Api 2.2项目 主项目,其中定义了DBContext类和连接字符串(在web.config文件中) 项目B. class级图书馆计划 项目A作为参考添加 模型和控制器定义 模型inheritance了一个Project A类 创建了一个DBContext类,它从项目AinheritanceDBContext。 public DbSet Planets {get; 组; } 我对上述项目结构背后的想法是: 在项目变大时降低复杂性 使其不那么复杂并增加可读性 在项目A中制作身份validation和授权逻辑 我必须在项目B中实现以下内容: 需要从项目A共享/访问连接字符串 需要先运行代码迁移。 需要知道在将应用程序部署到prod时如何运行代码首次迁移? 问题: 我已启用代码首次迁移并更新了数据库。 我运行没有任何问题,但它没有运行在项目A的web.config中配置的数据库。相反,它添加自己的本地数据库。 我是否应该在项目B中指定连接字符串。 如果是,作为一个类库,我该如何添加配置文件?

C# – 无法调用HttpConfiguration扩展方法

我无法调用HttpConfiguration扩展方法: using System.Configuration; using System.Web.Http; … var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); // <– error 错误:’System.Web.Http.HttpConfiguration’不包含’MapHttpAttributeRoutes’的定义,并且没有可以找到接受类型’System.Web.Http.HttpConfiguration’的第一个参数的扩展方法’MapHttpAttributeRoutes’(你错过了吗?使用指令或程序集引用?) 我尝试使用System.Web.Http版本4和5,以及“.NET Framework 4.5.2”和“.NET Framework 4”。 我错过了什么? 参考