【问题标题】:HttpClient.PostAsync returning Null on A Web API POSTHttpClient.PostAsync 在 Web API POST 上返回 Null
【发布时间】:2016-07-23 07:49:09
【问题描述】:

我正在尝试从 API 获取少数 GET 和 POST 调用的响应,每当我尝试从 Web API POST 获取响应时,它都会给出 System.NullReferenceException: Object reference not set to an instance of an object .。我正在使用 PostAsync 来获得响应。它在我的本地机器上工作得非常好但在部署机器上返回 NULL 响应

                    #region API_CALL

                    System.Net.Http.HttpClient Client = new System.Net.Http.HttpClient();
                    string CompleteURL = URL.Trim() + URL_FromJSON.Trim();

                    #region URL Construct For GET Requests

                    CompleteURL = GetURL(ParameterValue, CallType_FromJSON, CompleteURL);

                    #endregion URL Construct For GET Requests

                    string URLContent = string.Empty;
                    Client.BaseAddress = new System.Uri(CompleteURL);
                    byte[] cred = UTF8Encoding.UTF8.GetBytes(ClientID.Trim() + Constants.APIConstants.ColonConnector + ClientPass.Trim());
                    string Encoded = Convert.ToBase64String(cred);
                    Client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(Constants.APIConstants.AuthTypeBearer, accessToken);
                    Client.DefaultRequestHeaders.Host = IPAddress.Trim();
                    CacheControlHeaderValue val = new CacheControlHeaderValue();
                    val.NoCache = true;
                    Client.DefaultRequestHeaders.CacheControl = val;
                    Client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(Constants.APIConstants.ContentType));
                    Client.DefaultRequestHeaders.Add(Constants.APIConstants.LicenseKey, LiscenseKEY);
                    Client.DefaultRequestHeaders.Add(Constants.APIConstants.PostmanToken, PostmanToken);
                    //client.DefaultRequestHeaders.Add(Constants.APIConstants.AccessToken, accessToken);

                    System.Net.Http.HttpContent Content = new StringContent(JSONData, UTF8Encoding.UTF8, Constants.APIConstants.ContentType);

                    // Only for debug purpos:
                    LogManager.Logger.Invoke(LogLevels.TraceDetail, Source, "Request to API: " + JSONData, Request.ActorID);


                    HttpResponseMessage Message = new HttpResponseMessage();

                    if (CallType_FromJSON == Constants.HttpMethod.Post)
                    { Message = Client.PostAsync(CompleteURL, Content).Result; }
                    else if (CallType_FromJSON == Constants.HttpMethod.Get)
                    { Message = Client.GetAsync(CompleteURL, HttpCompletionOption.ResponseContentRead).Result; }
                    string Description = string.Empty;

                    #region Response Logging

                    try
                    {
                        LogManager.Logger.Invoke(LogLevels.TraceDetail, Source, "Response from API: " + Message.Content.ReadAsStringAsync().Result, Request.ActorID);
                    }
                    catch(Exception EX)
                    {
                        LogManager.Logger.Invoke(LogLevels.TraceError, Source, "Exception while logging response from API" + EX.ToString()+"Stack: "+EX.StackTrace, Request.ActorID);
                    }

                    #endregion Response Logging

                    if (Message.IsSuccessStatusCode)
                    {
                        string Result = Message.Content.ReadAsStringAsync().Result;
                        ResponseJson = Result;
                        Description = Result;
                    }
                    else
                    {
                        try
                        {
                            string Result1 = Message.Content.ReadAsStringAsync().Result;
                            LogManager.Logger.Invoke(LogLevels.TraceInfo, Source, "Failed: ... Recieved JSON: " + Result1, Request.ActorID);
                        }
                        catch { }
                        return new TransactionResponse() { Response = Constants.ResponseCodes.Error };
                    }
                    #endregion API_CALL

                    break;
            }

            TransactionResponse Response = new TransactionResponse();
            Response.Response = ResponseJson;
            return Response;
        }
        catch (Exception Ex)
        {
            LogManager.ExpLogger.Invoke(Source, Ex, Request.ActorID);
            return new TransactionResponse() { Response = Constants.ResponseCodes.Error };
        }

对象:执行Message = Client.PostAsync(CompleteURL, Content).Result后消息为空

【问题讨论】:

  • 你能展示你的api代码并提供一些细节吗?在这里很难理解您的代码和问题。
  • @kyur 我添加了代码...
  • 您是否尝试过使用 Fiddler 检查实际发送的 HTTP 请求是什么?

标签: post c#-4.0 asp.net-web-api deployment httpclient


【解决方案1】:

尝试在 postasynch 的范围内读取字符串异步,将它与它工作的相同代码块一起使用,

if (CallType_FromJSON == Constants.HttpMethod.Post)
{ Message = Client.PostAsync(CompleteURL, Content).Result; }
else if (CallType_FromJSON == Constants.HttpMethod.Get)
{ Message = Client.GetAsync(CompleteURL, HttpCompletionOption.ResponseContentRead).Result; }
string Description = string.Empty;

示例:

var = httpresult.content.readasstringasyhnc(); 

您还可以将类型转换为您想要的任何模型。

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多