3

我正在编写一个简单的 Web api 应用程序。当我需要在我的 web api 控制器中有两个 POST 方法时,我进入了一个阶段。其中一种方法有效,另一种无效。我的路由表如下所示:

       config.Routes.MapHttpRoute(
            name: "ApiRouteWithAction",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

然后我的方法定义如下:

    [HttpPost]
    public bool PostTaskAgain(My3TasksWebAPI.Data.Task task)
    {
        var oldTask = _db.Task.Where(t => t.Id == task.Id).SingleOrDefault();

        oldTask.DoAgain = true;
        oldTask.DateUpdated = task.DateUpdated;

        if (_db.SetOfTasks.Where(t => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(t.DateCreated, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday) == CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday)).Any())
        {
            int currentSetOfTasksId = _db.SetOfTasks.OrderBy(s => s.DateCreated).FirstOrDefault().Id;

            My3TasksWebAPI.Data.Task newTask = new Data.Task() { CreatedBy = oldTask.CreatedBy, DateCreated = oldTask.DateCreated, DateUpdated = null, DoAgain = false, Notes = string.Empty, SetOfTasksId = currentSetOfTasksId, Status = false, Title = oldTask.Title, UserId = oldTask.UserId };

            _db.Task.Add(newTask);
        }

        _db.SaveChanges();

        return true;
    }

    // Post api/values/PostSetOfTasks/{setOfTasks}
    [HttpPost]
    public bool PostSetOfTasks(My3TasksWebAPI.Data.SetOfTasks setOfTasks)
    {
        _db.SetOfTasks.Add(setOfTasks);

        _db.SaveChanges();

        return true;
    }

当我尝试调用 PostTaskAgain 时,出现内部服务器错误。我认为它可能是路由表,但我不确定如何处理两种发布方法。我从我的 asp.net mvc 应用程序中调用 web api,如下所示:

HttpResponseMessage response = client.PostAsJsonAsync("api/values/PostSetOfTasks", model.SetOfTasks).Result;

HttpResponseMessage response = client.PostAsJsonAsync("api/values/PostTaskAgain", taskToPost).Result;

这意味着我包括行动。

4

2 回答 2

3

在 webapi 中使用 POST 可能会很棘手,但很巧合的是,您的问题被证明是微不足道的。但是,对于那些可能偶然发现此页面的人:

我将特别关注 POST,因为处理 GET 是微不足道的。我不认为很多人会四处寻找解决 GET 与 webapis 的问题。无论如何..

如果您的问题是 - 在 MVC Web Api 中,如何 - 使用通用 HTTP 动词以外的自定义操作方法名称?- 执行多个帖子?- 发布多种简单类型?- 通过 jQuery 发布复杂类型?

那么以下解决方案可能会有所帮助:

首先,要在 Web API 中使用自定义操作方法,请添加一个 Web api 路由:

public static void Register(HttpConfiguration config)
{
            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}");
}

他们可以创建动作方法,例如:

[HttpPost]
        public string TestMethod([FromBody]string value)
        {
            return "Hello from http post web api controller: " + value;
        }

现在,从浏览器控制台触发以下 jQuery

$.ajax({
            type: 'POST',
            url: 'http://localhost:33649/api/TestApi/TestMethod',
            data: {'':'hello'},
            contentType: 'application/x-www-form-urlencoded',
            dataType: 'json',
success: function(data){ console.log(data) }
        });

其次,要执行多个post,很简单,创建多个action方法并用[HttpPost]属性装饰。使用 [ActionName("MyAction")] 来分配自定义名称等。下面第四点会来到jQuery

第三,首先,在单个操作中发布多个 SIMPLE 类型是不可能的,并且有一种特殊的格式来发布单个简单类型(除了以查询字符串或 REST 样式传递参数)。这就是让我与 Rest Clients 撞头并在网上搜寻近 5 个小时的原因,最终,以下 URL 帮助了我。仍然会引用链接的内容可能会死!

Content-Type: application/x-www-form-urlencoded
in the request header and add a = before the JSON statement:
={"Name":"Turbo Tina","Email":"na@Turbo.Tina"}

http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api

不管怎样,让我们​​结束那个故事。继续:

第四,通过 jQuery 发布复杂类型,当然 $.ajax() 将立即发挥作用:

假设 action 方法接受一个 Person 对象,它有一个 id 和一个名字。所以,从javascript:

var person = { PersonId:1, Name:"James" }
$.ajax({
            type: 'POST',
            url: 'http://mydomain/api/TestApi/TestMethod',
            data: JSON.stringify(person),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function(data){ console.log(data) }
        });

动作将如下所示:

[HttpPost]
        public string TestMethod(Person person)
        {
            return "Hello from http post web api controller: " + person.Name;
        }

以上所有,为我工作!干杯!

于 2014-03-18T18:41:49.250 回答
0

我的 LINQ 查询有问题。

The response from the server was: {"$id":"1","Message":"An error has occurred.","ExceptionMessage":"LINQ to Entities does not recognize the method 'Int32 GetWeekOfYear(System.DateTime, System.Globalization.CalendarWeekRule, System.DayOfWeek)' method, and this method cannot be translated into a store expression.","ExceptionType":"System.NotSupportedException","StackTrace":" at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTransl‌​ator.Translate(ExpressionConverter parent, MethodCall....

更正 linq 查询后,一切正常。Visual Studio 对我执行错误的 linq 查询很好。

于 2013-01-14T22:57:37.513 回答