Articles of asp.net web api

如何在.Net中优雅地关闭双向WebSocket

我有一个WebSocket服务器,它接受来自客户端的二进制数据流,并响应每4MB读取的另一个文本数据流。 服务器使用IIS 8和asp.net web api 。 服务器 public class WebSocketController : ApiController { public HttpResponseMessage Get() { if (!HttpContext.Current.IsWebSocketRequest) { return new HttpResponseMessage(HttpStatusCode.BadRequest); } HttpContext.Current.AcceptWebSocketRequest(async (context) => { try { WebSocket socket = context.WebSocket; byte[] requestBuffer = new byte[4194304]; int offset = 0; while (socket.State == WebSocketState.Open) { var requestSegment = new ArraySegment(requestBuffer, offset, requestBuffer.Length […]

防止在.NET Azure Web Api中使用PATCH覆盖某些字段

我正在创建一个带有.NET后端的Azure移动服务,它使用TableController(ApiController的子类)来处理REST请求。 在我的PATCH方法中,我想限制允许更新的字段集。 我有一个AccountController,我不希望覆盖Username和UserId字段。 public class AccountController : TableController { … // PATCH tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959 public Task PatchAccount(string id, Delta patch) { return UpdateAsync(id, patch); } … } 我想发回一个有意义的HTTP响应,如403: Forbidden或类似的,如果连接到API的客户端试图更新用户名或userId。 所以我需要一些方法来了解Delta补丁的内容或在更新’禁用’字段时有自动响应。

将Firebird连接到ASP.net WebAPI项目

我正在学习ASP.net,特别是WebAPI和MVC。 我正在使用Visual Studio Community 2013,.NET 4.5和C#。 我是一个全新的,所以我实际上正在通过这个特定的演练来了解事情是如何工作的: http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api 到目前为止一切正常,但我想继续连接数据库以填充我的数据集。 我非常熟悉使用Firebird并能够将Firebird安装为数据提供者(通过NuGet并安装相应的DDEX文件)。 不幸的是,我很难理解如何查询数据库并填充我的数组。 基本上,这就是我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using FirebirdSql.Data.FirebirdClient; using System.Configuration; using System.Collections; namespace NBAPoolWebService.Controllers { public class UserController : ApiController { User[] users = new User[] { new User { ID = 1, CREATED=new DateTime(2011, 1, 12), […]

列出多个组下的API方法

我有Swashbuckle带注释的代码,如下所示: [Route(“api/Subscribers/{id}/[controller]”)] [Route(“api/Organizations/{id}/[controller]”)] public class AddressesController : Controller { [HttpGet(“{aid}”)] [SwaggerResponse(HttpStatusCode.OK, Type = typeof(PostalRecord))] public async Task GetAddress(Guid id, Guid aid) { //do something } 我想使用GroupActionsBy自定义,如本例所示 ,但我希望将上面的GetAddress方法同时包含在两个独立的组中,这些组对应于显示的两个路由前缀: [Route(“api/Subscribers/{id}/[controller]”)] [Route(“api/Organizations/{id}/[controller]”)] 换句话说,我希望在两者下列出相同的方法: 认购 组织 如何才能做到这一点? 顺便说一下,我正在使用ASP.NET Core( dnx46 )。 如果还不能使用Swashbucklee的ASP.NET核心版本执行此操作,那么仍然可以欣赏完整的CLR(Web API 2.2?)示例。 另外,关于我正在尝试做的更完整的故事 – 我有一个单独的SOpost 。 更新 @venerik给出的答案让我接近解决方案。 当我申请他的示例代码时…… [SwaggerOperation(Tags = new []{“Subscribers”, “Organizations”})] …这导致Swagger列表看起来像这样: 简而言之,“地址”端点现在出现在我想要的标题下,但是,正如红色箭头所示,它们现在也被“交叉列出”; 我不希望“订户”端点列在“组织”端点下。 […]

Web API:使用不同HTTP谓词的相同方法

在WEB API控制器中,我们可以使用不同的HTTP谓词具有相同的方法名称吗? [HttpGet] public string Test() { return “Success Get”; } [HttpPost] public string Test(int i) { return “Success Post”; } Swagger不接受此配置。 访问API方法时出现此错误: 500:“消息”:“发生错误。”,“ExceptionMessage”:“Swagger 2.0不支持:路径’api / Common’和方法’POST’的多个操作。请参阅配置设置 – \”ResolveConflictingActions \“一个潜在的解决方法“ 这是我的routeconfig : config.Routes.MapHttpRoute( name: “DefaultApiByName”, routeTemplate: “api/{controller}/{action}/{name}”, defaults: new { id = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: “DefaultApiByAction”, routeTemplate: “api/{controller}/{action}” ); config.Routes.MapHttpRoute(“DefaultApi”, “api/{controller}/{id}”, new { […]

从Service Fabric WebAPI控制器写入ServiceEventSource

在我的有状态服务中,我可以通过调用以下方法写入ServiceEventSource : ServiceEventSource.Current.ServiceMessage(this.Context, “this is my log message”); 有谁知道如何在我的无状态WebAPI控制器中进行相同的调用? 好像我无法将上下文输入控制器。 我注意到它只在我的OwinCommunicationListener可用。 基本上,我希望能够像这样记录我的控制器: public async Task Get(string id) { ServiceEventSource.Current.ServiceMessage(this.Context, “this is my log message”); //Do something return Ok(100); }

Url.Link无法在WebAPI中使用

使用下面的unit testing..我试图测试我的webapi。 [Test] public void CheckControllerForCreate() { var config = new HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; var request = new HttpRequestMessage(HttpMethod.Post, “http://localhost/api/product”); var route = config.Routes.MapHttpRoute(“Foo”, “api/{controller}/{id}”); var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { “controller”, “products” } }); var controller = new ProductController { ControllerContext = new HttpControllerContext(config, routeData, request), Request = request, Url […]

ConnectionString属性尚未在update-database上初始化

在包管理器控制台中,我在azure上对我的数据库运行命令更新数据库,但是我收到错误,说ConnectionString属性尚未初始化。 我对本地数据库做了同样的事情,一切都很顺利。 在我的web配置中,我已经将连接字符串更改为mach我的azure数据库,这是我的数据库上下文的样子: public class MadLabsDatabaseContext : IdentityDbContext { public MadLabsDatabaseContext() : base(“DefaultConnection”) { Configuration.LazyLoadingEnabled = true; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .ToTable(“AspNetUsers”); modelBuilder.Entity() .ToTable(“AspNetUsers”); } } 这是web.config中的连接字符串: 这是我的Package Manager控制台代码: Update-database -ConnectionString “Data Source=tcp:serverName.database.windows.net,1433;Database=madLabs_db;User ID=userName;Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True;” -ConnectionProviderName “System.Data.SqlClient” 为什么我收到此错误?

使用API​​Controller补充序列化

我们有多个API控制器接受GET请求,如下所示: //FooController public IHttpActionResult Get([FromUri]Foo f); //BarController public IHttpActionResult Get([FromUri]Bar b); 现在 – 我们希望(或者,被迫) 全局更改GET查询字符串中的DateTime字符串格式 “yyyy-MM-ddTHH:mm:ss” -> “yyyy-MM-ddTHH.mm.ss” 更改后,包含DateTime类型的类的所有[FromUri]序列化都将失败。 有没有办法补充[FromUri]序列化以接受查询字符串中的DateTime格式? 或者我们是否必须为所有API参数构建自定义序列化以支持新的DateTime字符串格式? 编辑 :请求的示例 public class Foo { public DateTime time {get; set;} } //FooController. Let’s say route is api/foo public IHttpActionResult Get([FromUri]Foo f); GET api/foo?time=2017-01-01T12.00.00

‘参数字典包含空条目’错误,Web API

在我的Web API上,我有一个文档控制器,它有两个简单的操作: [AllowAnonymous] public class DocumentController : ApiController { public String Get(int id) { return “test”; } public String Get(string name) { return “test2”; } } 以下URL(执行第一个函数)工作正常: HTTP://本地主机:1895 / API /文档/ 5 但是这个URL(应该执行第二个函数): HTTP://本地主机:1895 / API /文档/测试 引发此错误: {“message”:“请求无效。”,“messageDetail”:“参数字典包含方法’xx.yy.Document Get的非可空类型’System.Int32’的参数’id’的空条目( Int32)’in’API.Controllers.DocumentController’。可选参数必须是引用类型,可以为空的类型,或者声明为可选参数。“ } 这是MapHttpRoute中的MapHttpRoute: config.Routes.MapHttpRoute( name: “DefaultApi”, routeTemplate: “{controller}/{id}”, defaults: new { id = RouteParameter.Optional } […]