1

POST と GET の両方で WebAPI 非同期を呼び出す MVC アプリケーションがあります。WebAPI と MVC アプリケーションの両方をローカルで実行すると、WebAPI 応答は成功と表示されますが、SendAsync 要求は 500 を返します。また、Fiddler は API 呼び出しを表示しません。非同期リクエストの処理方法に関係があるのではないかと疑っていますが、何が欠けているのかわかりません。

API への MVC コントローラー呼び出し:

public Model UploadFile(Model formCollection)
{
    var documentModel = formCollection.ToString();

    var client = new HttpClient();
    var uri = new Uri(BaseUri + "document/");

    var content = new StringContent(documentModel);

    var request = new HttpRequestMessage(HttpMethod.Post, uri) {Content = content};

    request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

    var response = client.SendAsync(request);
    response.Wait();

    try
    {
        var returned = response.Result;
        if (returned.StatusCode != HttpStatusCode.OK)
        {
            throw new Exception(returned.RequestMessage.ToString());
        }

        var model = JsonConvert.DeserializeObject<Model>    (returned.Content.ReadAsStringAsync().Result);
        model.FileContents = "";

        return model;
    }
    catch(Exception e)
    {
        var error = new Exception("Service failure - ", e);
        throw error;
    }
}

WebAPI の投稿:

[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]Model model)
{
    var response = await SubmitNew(model);

    return Request.CreateResponse(response);
}

Post の戻り値にブレークポイントを設定すると有効な応答が表示されますが、応答では MVC コントローラーで 500 が表示されます。

return Request.CreateResponse(HttpStatusCode.OK, result);

クライアントが 500 を表示している理由について何か考えはありますか?

4

3 に答える 3

2

Global.asax.cs で

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // Try adding the following lines:
        var configuration = GlobalConfiguration.Configuration;
        var formatters = configuration.Formatters;
        formatters.Clear();
        formatters.Add(new JsonMediaTypeFormatter());
    }

    // A good idea to have this:
    protected void Application_Error()
    {
        Exception unhandledException = Server.GetLastError();
        // Set a breakpoint here or do something to log the exception
    }

に追加されたコードApplication_Startにより、シリアル化が JSON との間でのみ行われるようになります。これは最終的なコードでは必要ないかもしれませんが、問題の原因を特定するための一時的な手段として役立つ場合があります。

追加するApplication_Errorと、コントローラー メソッドから返されたオブジェクトをシリアル化するときなど、WebAPI レイヤー内で発生する問題をキャッチするのに役立ちます。

私の疑いはSubmitNew、無限再帰参照 (例: 相互参照を持つ親子構造) など、シリアル化できないものを返していることです。

于 2016-12-23T16:30:31.613 に答える
1

最初の POST および GET 呼び出しの結果の後に発生していた WebAPI のログ サービスでタイムアウト エラーが発生していました。問題は解決されました。

于 2016-12-23T17:57:04.450 に答える