Tag: asp.net web api2

ASP.NET Web API 2和部分更新

我们正在使用ASP.NET Web API 2并希望以下列方式公开部分编辑某些对象的能力: HTTP PATCH / customers / 1 { “firstName”: “John”, “lastName”: null } …将firstName设置为”John” ,将lastName为null 。 HTTP PATCH / customers / 1 { “firstName”: “John” } …只是为了将firstName更新为”John”并且根本不触及lastName 。 假设我们有很多属性要用这种语义更新。 这是OData行使的非常方便的行为。 问题是默认的JSON序列化器在这两种情况下都会出现null ,因此无法区分。 我正在寻找一些方法来使用某种包装器(带有值和标志设置/未设置)来注释模型,这样可以看到这种差异。 任何现有的解决方案?

WebApi2属性路由inheritance了控制器

我正在尝试使用基本控制器创建基本的REST API,如下所示: 基类: public abstract class WebApiEntityController : ApiController where TEntity : EntityBase { private readonly IRepository _repository; protected WebApiEntityController(IRepository repository) { _repository = repository; } [Route(“”)] [WebApiUnitOfWork] public HttpResponseMessage Get() { return Request.CreateResponse(HttpStatusCode.OK, _repository.ToList()); } [……….] 派生类: [RoutePrefix(“api/TimesheetTask”)] public class TimesheetTaskController : WebApiEntityController { private readonly IRepository _timeSheetTaskRepository; public TimesheetTaskController(IRepository timeSheetTaskRepository) : base(timeSheetTaskRepository) { […]

如何正确unit testingOData v6.0控制器?

我正在尝试对OData控制器进行unit testing,但API已更改,之前推荐的方法我尝试不起作用 – 目前我正在使用 没有注册非OData HTTP路由。 当试图将ODataQueryOptions实例化为传递给控制器​​的Get方法时 我目前的代码(基于这样的答案): [TestMethod()] public void RankingTest() { var serviceMock = new Mock(); serviceMock.SetReturnsDefault<IEnumerable>(new List() { new Vendor() { id = “1” } }); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, “http://localhost/odata/Vendor”); ODataModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet(“Vendor”); var model = builder.GetEdmModel(); HttpRouteCollection routes = new HttpRouteCollection(); HttpConfiguration config = new HttpConfiguration(routes) […]

来自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 […]

想了解异步

我已经使用了异步编码,但我并不完全理解如何使用它 – 尽管我理解这个概念以及为什么需要它。 这是我的设置: 我有一个Web API,我将从我的ASP.NET MVC应用程序调用,我的Web API将调用DocumentDB。 在代码示例中,我在向DocumentDB发送查询时看到了很多等待关键字。 如果我需要在我的MVC应用程序异步中使我的索引操作方法,我很困惑? 如果我的Web API中的CreateEmployee()方法应该是异步的,我也很困惑? 在这种情况下使用异步的正确方法是什么? 这是我的代码(这段代码目前给我错误,因为我的MVC动作方法不是异步)—- ASP.NET MVC应用程序代码—- public ActionResult Index() { Employee emp = new Employee(); emp.FirstName = “John”; emp.LastName = “Doe”; emp.Gender = “M”; emp.Ssn = “123-45-6789”; using (var client = new HttpClient()) { client.BaseAddress = new Uri(“http://myWebApi.com”); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); HttpResponseMessage response = await […]

Web API 2 Http Post方法

我很反感没有找到解决这个问题的办法。 我开始使用Web API 2创建一个新的api,但是无法使POST和PUT工作。 Get all和Get单项完美运行。 在任何地方都没有相关文章,我发现的那些文章只与Get和Web API有关,而与Web API 2无关。 任何帮助都可以。 // POST: api/checkOuts [HttpPost] [ResponseType(typeof(checkOut))] [ApiExplorerSettings(IgnoreApi = true)] public async Task PostcheckOut(checkOut co) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.checkOuts.Add(checkOut); try { await db.SaveChangesAsync(); } catch (DbUpdateException) { if (checkOutExists(checkOut.id)) { return Conflict(); } else { throw; } } return CreatedAtRoute(“DefaultApi”, new { […]

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/是答案这里。 有任何想法吗?

在Entity Framework支持的Web API 2 POST调用中返回一个对象以及409 Conflict错误?

我有一个C#Entity Framework Web API 2控制器 。 目前,当通过POST方法尝试创建具有相同文本的主文本字段的对象时,我返回409 Conflict错误作为StatusCode结果,以指示添加被视为重复。 我想做的是返回触发重复错误的服务器端对象。 所以我需要一些类似于Ok()方法的东西,但是一个变量返回409 Conflict错误作为HTTP状态代码而不是HTTP OK状态代码 。 有这样的事吗? 我怎样才能做到这一点? 如果我可以完成这项工作,客户端在收到409 Conflict错误后不必对服务器进行后续的Get调用以获取现有对象。 这是当前的POST方法: public IHttpActionResult PostCanonical(Canonical canonical) { if (!ModelState.IsValid) { return BadRequest(ModelState); } // Check for duplicate Canonical text for the same app name. if (db.IsDuplicateCanonical(canonical.AppName, canonical.Text)) { // It’s a duplicate. Return an HTTP 409 Conflict error to […]

在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 […]