3

私は簡単なWebAPIアプリケーションを書いています。WebAPIコントローラーに2つのPOSTメソッドが必要な段階になりました。これらの方法の1つは機能し、もう1つは機能しません。私のルートテーブルは次のようになります。

       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を呼び出そうとすると、内部サーバーエラーが発生します。ルーティングテーブルかもしれないと思いますが、2つのpostメソッドの扱い方がわかりません。asp.netmvcアプリケーションから次のようにWebAPIを呼び出します。

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を操作するのは難しい場合がありますが、問題は些細なものであることが判明しました。ただし、このページに出くわす可能性のある人のために:

GETの処理は簡単なので、特にPOSTに焦点を当てます。webapisを使用したGETの問題を解決するために多くの人が探し回っているとは思いません。いずれかの方法..

質問が-MVCWebApiで、どのように---一般的なHTTP動詞以外のカスタムアクションメソッド名を使用しますか?-複数の投稿を実行しますか?-複数の単純なタイプを投稿しますか?-jQueryを介して複合型を投稿しますか?

次に、次の解決策が役立つ場合があります。

まず、Web APIでカスタムアクションメソッドを使用するには、次のようにWebAPIルートを追加します。

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) }
        });

次に、複数の投稿を実行するには、簡単です。複数のアクションメソッドを作成し、[HttpPost]属性で装飾します。[ActionName( "MyAction")]を使用して、カスタム名などを割り当てます。以下の4番目のポイントでjQueryにアクセスします。

第三に、まず第一に、単一のアクションで複数のSIMPLEタイプを投稿することは不可能であり、単一の単純なタイプを投稿するための特別な形式があります(クエリ文字列またはRESTスタイルでパラメーターを渡すことを除く)。これが、Rest Clientsで頭を悩ませ、ほぼ5時間Webを探し回ったポイントであり、最終的には次の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

とにかく、その話を乗り越えましょう。次に進む:

第4に、jQueryを介して複合型を投稿することはもちろん、$。ajax()がすぐに次の役割を果たします。

アクションメソッドがIDと名前を持つPersonオブジェクトを受け入れるとしましょう。だから、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 に答える