【问题标题】:Error retrieving data from Api Controller从 Api 控制器检索数据时出错
【发布时间】:2018-09-07 06:11:46
【问题描述】:

我正在使用 Visual Studio 2017 开发 ASP.NET Core Api 和 Xamarin 表单客户端。

我遇到了一个错误

System.Runtime.Serialization.SerializationException:无效的 JSON 字符串

因为response.Content 为空,当从API 检索数据时,但当将此Url 粘贴到浏览器“https://localhost:44305/api/Agreement/GetAgreementText/1”时,它会在浏览器中显示数据。当我使用客户端运行时,它不会命中 api 方法调试点。

这是我的 APi 方法

[HttpGet]
[Route("GetAgreementText/{id}")]
public DefaultApiResult GetAgreementText(long Id)
{
    Company com = _companyRepository.Get(Id);
    string st = com.AgreementText;

    DefaultApiResult result = new DefaultApiResult
            {
                Data = st
            };
    return result;
}

这是我的客户端应用Api调用方法

public string GetAgreementTextLoading(long idCompany)
{
    string agreementText = "";
    // var token = _tokenService.GetLastActivateToken().Hash;
    var clientURL = "https://localhost:44305/";
    var client = new RestClient(clientURL);
    var request = new RestRequest("api/Agreement/GetAgreementText/{Id}", Method.GET);

    request.AddUrlSegment("Id", idCompany.ToString());

    IRestResponse response = client.Execute(request);
    AppRestResponse apiResponse = SimpleJson.DeserializeObject<AppRestResponse>(response.Content);

    var statusMessage = "";

    if (apiResponse.Success)
    {
        statusMessage = "Success.";

        if (!string.IsNullOrEmpty(response.Content))
        {
            agreementText = apiResponse.Data.ToString();
        }
        else
        {
            throw new Exception("Invalid response");
        }
    }
    else
    {
        agreementText = "Error retrieving agreement text";
    }

    return agreementText;
}

public class AppRestResponse
{
    public bool Success { get; set; }
    public object Data { get; set; }
    public IEnumerable<AppRestReponseError> ErrorMessages { get; set; }
}

public class DefaultApiResult
{
        public bool Success
        {
            get
            {
                return ErrorMessages.Count == 0;
            }
            private set { }
        }

        public List<ErrorMessage> ErrorMessages { get; set; }

        public object Data { get; set; }

        public DefaultApiResult()
        {
            ErrorMessages = new List<ErrorMessage>();
        }

        public DefaultApiResult(string errorMessage)
            :this()
        {
            ErrorMessages.Add(new ErrorMessage()
            {
                Message = errorMessage
            });
        }

        public DefaultApiResult(string[] errorMessages)
            :this()
        {
            foreach (var errorMessage in errorMessages)
            {
                ErrorMessages.Add(new ErrorMessage()
                {
                    Message = errorMessage
                });
            }
        }
    }

【问题讨论】:

  • 能否请您发布DefaultApiResultAppRestResponse 的定义?
  • 我把它添加到我的问题中
  • 您确定同时运行这两个项目吗?

标签: asp.net asp.net-web-api asp.net-core asp.net-core-webapi


【解决方案1】:

我不确定SimpleJson 和您正在使用的其他客户端。

但是,假设您使用的是 RestSharp ,似乎没有必要在这里使用 SimpleJson 来反序列化响应。

我只是删除了以下代码:

IRestResponse response = client.Execute(request);
AppRestResponse apiResponse = SimpleJson.DeserializeObject<AppRestResponse>(response.Content);

并添加以下两行:

IRestResponse<AppRestResponse> response = client.Execute<AppRestResponse>(request);
var apiResponse= response.Data;

它按预期工作。

【讨论】:

  • 我检查了您的代码“System.Net.WebExceptionStatus.ConnectFailure”错误是否存在
  • @charitht99perera 能否提供更多有关System.Net.WebExceptionStatus.ConnectFailure 错误的信息?
猜你喜欢
  • 2016-12-17
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多