.NET Standard 2,.NET Core 2,HttpClient的行为不符合预期(传递null)

SlackerCoder

一些概述:

我们有一个.NET Standard(2.0)项目,该项目调用WebApi(.NET Core 2.0),该项目应处理一条消息(通过消息,它可以是用户想要记录的任何内容,可以是异常,警告或只是要存储的注释)在数据库中)存储该消息,并将更新后的消息返回给调用方。

问题:当我从.NET Standard项目(使用HttpClient)调用WebApi时,实际上并没有按请求发布对象。当它在.NET Standard项目中运行时,该对象将填充所需的所有字段,在这种情况下,将捕获该异常,并传递消息,stacktrace等。

这是.NET Standard项目的代码:

        IDataAccessResult<CaughtException> result = new DataAccessResult<CaughtException>();

        string baseUrl = "baseurl";
        var client = new HttpClient();

        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("a", "b");

        // HTTP POST
        var myContent = JsonConvert.SerializeObject(caughtException);
        StringContent sc = new StringContent(myContent, System.Text.Encoding.UTF8, "application/json");
        System.Uri uri = new System.Uri(string.Format("{0}/api/v6/CaughtException/SaveAsync", baseUrl));

        HttpResponseMessage response = await client.PostAsync(uri, sc);

        response.EnsureSuccessStatusCode();
        if (response.IsSuccessStatusCode)
        {
            result = JsonConvert.DeserializeObject<DataAccessResult<CaughtException>>(await response.Content.ReadAsStringAsync());
        }

当此调用传递给WebApi时,该对象不再包含任何数据,而是充满了空值和空字符串,这使我相信POST实际上并未发送数据。

在这一点上,我真的不确定我缺少什么。Google几乎没有帮助,甚至找不到与我的问题类似的东西。

在烧毁了调用堆栈后,它会吐出一些错误消息,这又一次使我很少有机会连接到我的代码,但是它们是:

> WinHttpException: The connection with the server was terminated abnormally

> Unknown location

> IOException: The read operation failed, see inner exception.

>System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
>System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Threading.Tasks.RendezvousAwaitable.GetResult()
System.Net.Http.WinHttpResponseStream+<CopyToAsyncCore>d__18.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Net.Http.NoWriteNoSeekStreamContent+<>c.<SerializeToStreamAsync>b__4_0(Task t, object s)
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, object state)
System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref Task currentTaskSlot)
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Net.Http.HttpContent+<LoadIntoBufferAsyncCore>d__48.MoveNext()

> HttpRequestException: Error while copying content to a stream.

>System.Net.Http.HttpContent+<LoadIntoBufferAsyncCore>d__48.MoveNext()
>System.Net.Http.HttpContent+<LoadIntoBufferAsyncCore>d__48.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Net.Http.HttpClient+<FinishSendAsyncBuffered>d__58.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
LogService.Gateway.CaughtExceptionGateway+<SaveAsync>d__6.MoveNext() in CaughtExceptionGateway.cs
+
            HttpResponseMessage response = await client.PostAsync(uri, sc);
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
LogService.Api.CaughtExceptionController+<LogError>d__11.MoveNext() in CaughtExceptionController.cs
+
            ce = (await _exceptions.SaveAsync(ce)).Payload;
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
LogService.Api.CaughtExceptionController+<GetCaughtExceptionAsync>d__5.MoveNext() in CaughtExceptionController.cs
+
                    CaughtException ce = await LogError(action, controller, loggingApplicationCodeId, accountId, loggingExceptionTypeId, e.Exception.Message, e.Exception.StackTrace, null, token, storedProcedureName, storedProcedureParameters);
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeActionMethodAsync>d__12.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

有没有人看到/遇到/解决过这个问题?使用HttpClient通话时我做错什么了吗?

SlackerCoder

好吧,在绝对绝对彻底的行为中(不是一句话,但我需要做出一些解释以解释我现在的感觉如何愚蠢),我找出了问题所在。

Webapi方法签名是罪魁祸首:

public async Task<IActionResult> SaveAsync([FromBody]CaughtException caughtExceptionItem)

我错过了[FromBody]之前,我已经为大多数系统制作了api,但我不知道为什么错过了这么简单的东西。

希望我的错误(以及以后浪费的时间)对其他人有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章