Tag: asp.net web api

Json.NET – 阻止重新序列化已经序列化的属性

在ASP.NET Web API应用程序中,我正在使用的一些模型包含一大块ad-hoc JSON,仅在客户端有用。 在服务器上,它只是作为字符串进出关系数据库。 性能是关键,根本不需要处理JSON字符串服务器端。 所以在C#中,想象一个像这样的对象: new Person { FirstName = “John”, LastName = “Smith”, Json = “{ \”Age\”: 30 }” }; 默认情况下,Json.NET会像这样序列化这个对象: { “FirstName”: “John”, “LastName”: “Smith”, “Json”: “{ \”Age\”: 30 }” } 我希望能够指示Json.NET假设Json属性已经是序列化表示,因此它不应该重新序列化,并且生成的JSON应该如下所示: { “FirstName”: “John”, “LastName”: “Smith”, “Json”: { “Age”: 30 } } 理想情况下,这适用于两个方向,即在POST JSON表示时,它将自动反序列化为上面的C#表示。 使用Json.NET实现这一目标的最佳机制是什么? 我需要自定义JsonConverter吗? 是否有一个更简单的基于属性的机制? 效率很重要; 重点是跳过序列化开销,这可能是一个微优化,但为了论证,让我们假设它不是。 (可能会返回包含大量Json属性的大列表。)

如何在WebApi中inheritance控制器类级别的路由前缀?

注意,我已经阅读了新的路由function作为WebApi 2.2的一部分,以允许inheritance路由。 但是,这似乎并没有解决我的特定问题。 它似乎解决了inheritance动作级别路由属性的问题,但没有解决在类级别定义的路由前缀。 http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22#ARI 我想做这样的事情: [RoutePrefix(“account”)] public abstract class AccountControllerBase : ControllerBase { } [RoutePrefix(“facebook”)] public class FacebookController : AccountControllerBase { [Route(“foo”)] public async Task GetAsync() { … } } [RoutePrefix(“google”)] public class GoogleController : AccountControllerBase { [Route(“bar”)] public async Task GetAsync() { … } } 我希望inheritanceaccount路由前缀,因此在定义Facebook和Google控制器时,我会获得路由: ~/account/facebook/foo ~/account/google/bar 目前,在没有基类的account部分的情况下定义路由。

使用Url.Link在Web API中生成HTTPS链接

我需要为ASP.NET Web API生成绝对URL以用于以后的回调/重定向。 可以使用生成链接 Url.Link(“RouteName”, new { controller = “Controller”, action = “Action” }); 这会返回正确的Url,但是,我需要它始终是https。 Url.Link似乎使用当前请求的方案生成URL。 例如,如果生成url的请求类似于http://www.myhost.com/controller/generateUrl,则Url.Link会生成一个http url。 如果生成URL的请求是https://www.myhost.com/controller/generateUrl,则Url.Link会生成httpsurl。 需要始终使用https生成url。 是否有可以传递给Url.Link的参数或路由值来实现此目的? 谢谢。

Web Api Controller在其他项目中,路由属性不起作用

我有两个项目的解决方案。 一个Web Api bootstap项目,另一个是类库。 类库包含一个带属性路由的ApiController。 我将web api项目中的引用添加到类库中,并希望它能够正常工作。 Web api中的路由配置为: config.MapHttpAttributeRoutes(); 控制器很简单,看起来像: public class AlertApiController:ApiController { [Route(“alert”)] [HttpGet] public HttpResponseMessage GetAlert() { return Request.CreateResponse(HttpStatusCode.OK, “alert”); } } 但是当我转到url“/ alert”时,我得到了404。 我在这里想念的是什么? 为什么我不能使用这个控制器? 组装肯定是加载所以我不认为http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/是答案这里。 有任何想法吗?

为什么WebApi控制器操作后没有人处理DbContext?

我知道各种教程以及针对具有WebApi控制器的WebApi和Entity Framework (甚至来自Microsoft)的完整示例,如下所示: public HttpResponseMessage GetInternet(int id) { var context = new InternetDbContext(); var result = (from internet in context.Internets where internet.Id.Equals(id) select internet).FirstOrDefault(); if(result != null) Request.CreateResponse(HttpStatusCode.OK, result); } 但是,当我在2年前学习Entity Framework ,我发现的关于框架的每一个资源都指出了在最短的可能生命周期中 DbContex是多么重要,例如使用’ using ‘。 而现在,人们似乎并没有放弃处理任何东西(他们的经理,存储库,DI容器……)。 我在这里错过了什么吗? API调用的结尾是否会自动处理上下文? 或者我必须使用来自http://msdn.microsoft.com/en-us/library/dn153859(v=vs.118).aspx的 HttpRequestMessageExtensions.RegisterForDispose()类的东西?

WebApi强制操作返回xml

我有这个动作: public IHttpActionResult SearchFor(int aboItemType, DTO.FilterColumns filter) { //Do stuff… return Ok(ds); } 我的客户做了: client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/xml”)); var response = client.PostAsJsonAsync(myurl).Result; if (response.IsSuccessStatusCode) { var results = HttpUtility.HtmlDecode(response.Content.ReadAsStringAsync().Result); } 上述场景完美无缺。 但是,如果我对Accept行进行注释,则该操作将以json格式返回数据集。 我想强制这一个特定的操作总是在xml中发送结果。 这可能吗? 也许有一个属性?

Owin SelfHost WebApi – 客户端在响应期间关闭连接会引发exception吗?

我正在运行一个基于Owin Selfhost的WebApi,我在其中放入了一个API未处理的exception记录器 config.Services.Add(typeof(IExceptionLogger), _apiExceptionLogger); ApiExceptionLogger的相关部分: public override void Log(ExceptionLoggerContext context) { if (context == null || context.ExceptionContext == null) return; Logger.Error(“Unhandled exception from Web API”, context.ExceptionContext.Exception); } 它定期捕获和记录的情况是客户端请求数据集然后在结果(JSON)被发送回来时关闭连接的人 – 在chrome中发出请求的人,然后在所有结果返回之前点击X按钮: P 为了完整性,我在下面粘贴了一个堆栈跟踪,只想知道两件事: 这是常规/预期的行为吗? AFAIK是……我正在运行一个非常默认的API和管道 有没有办法处理这个? 基本上在取消的情况下更优雅地停止请求处理(在整个请求管道中记录的取消令牌确实浮现在脑海中,但在这种情况下它们看起来并不像在所有令牌仅支持合作取消之后) 我没有深入研究套接字级别发生的事件序列,到目前为止,这只是一个日志记录麻烦。 System.Net.Http.HttpRequestException: Error while copying content to a stream. —> System.IO.IOException —> System.Net.HttpListenerException: The I/O operation has been aborted […]

Web API ActionFilter修改返回的值

我有一个Web API应用程序,我需要通过ActionFilter的OnActionExecuted方法获得一些API端点的返回值 我正在使用自定义属性来标识具有我需要修改的数据的端点,但我似乎无法从HttpActionExecutedContext中找到实际的结果对象。 谢谢你的帮助!

在Web API控制器中构建JSON响应

在WebAPI项目中,我有一个控制器,它根据用户输入的值检查产品的状态。 让我们说他们输入“123”并且响应应该是“状态”:1,和产品列表。 如果输入“321”,则“状态”为0,产品列表。 我的问题是,如何在WebAPI控制器中构建正确的字符串。 [Route(“{value:int}”)] public string GetProducts(int value) { var json = “”; var products = db.Products; if (products.Any()) { foreach (var s in products) { ProductApi product = new ProductApi(); product.Name = s.Name; json += JsonConvert.SerializeObject(supplier); } } var status = db.Status; if (status.Any()) { json += “{status:1}”; } else { json += […]

WebAPI 2.1中的Ninject错误 – 确保控制器具有无参数的公共构造函数

我在WebAPI项目中安装了以下软件包及其依赖项: Ninject.Web.WebApi Ninject.Web.WebApi.OwinHost 我这纯粹是作为web-api项目运行的。 没有MVC。 当我运行我的应用程序并向AccountController的Register操作发送POST时,我收到以下错误: { “message”:”An error has occurred.”, “exceptionMessage”:”An error occurred when trying to create a controller of type ‘AccountController’. Make sure that the controller has a parameterless public constructor.”, “exceptionType”:”System.InvalidOperationException”, “stackTrace”:” at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()”, “innerException”:{ “message”:”An error […]