【问题标题】:Error receiving a HttpResponseMessage OK接收 HttpResponseMessage 时出错 OK
【发布时间】:2016-10-27 14:27:22
【问题描述】:

我遇到了问题。我有 2 个 WebApi。 webapi2 从 DB 中获取数据并返回 IMAGE。在这里,它可以正常工作。如果我在浏览器上尝试,请显示图像,或者如果我更改,则显示字节数组。 问题出在调用此 webapi2 的 Webapi1 上。对于 IsSuccessStatusCode,我总是收到带有 false 的 HttpResponseMessage。错误是 500 内部服务器错误。 我是新手,我不知道该怎么做...我已经尝试了很多东西

public async Task<HttpResponseMessage> GetFoto(string exemplo, string exemple2)
        {
            HttpClientHandler handler = new HttpClientHandler()
            {
                UseDefaultCredentials = true,
            };
        using (var client = new HttpClient(handler))
        {

            client.BaseAddress = new Uri("http://192.111.56.1:1762/");

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = await client.GetAsync("api/Tr/Test?exemplo="+exemplo+"&pk="+pk+"");

            if (response.IsSuccessStatusCode)
            {
                var data = response.Content.ReadAsByteArrayAsync().Result;
                var stream = new MemoryStream(data);
                response.Content = new StreamContent(stream);
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");

                return response;
            }
            else
            {

                Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
                return null;
            }


        }
    }

我的 webapi 有效并返回给我一张图片:

  //connections code that doesn´t matter....

            try
            {

                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                var stream = new MemoryStream(imgBytes);
                result.Content = new StreamContent(stream);
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");

                return result;

            }

            catch (Exception ex)
            {
                return Request.CreateResponse(HttpStatusCode.Gone);
            }

【问题讨论】:

  • 您是否检查过系统事件日志和任何应用程序日志以了解导致 500 的原因?他们被调用的 API 很可能引发了异常。确保您不只是使用 try {} catch {} 丢弃异常,并确保使用 try catch 将方法包装在 API 中,该 try catch 将任何异常记录到文件系统以帮助进行故障排除。祝你好运!
  • @MurrayFoxcroft 我编辑了帖子!所以,是的,我正在使用try catch。问题是 webapi 的响应正常并返回图像......当其他 webapi 收到这个时,这就是问题所在。我不知道这些日志在哪里。
  • 啊,所以其他WebApi不在你的控制之下?您需要去找供应商/所有者并要求他们检查他们的日志。 500 通常是 API 中未处理的错误。如果您的数据不正确或调用不正确,它应该(如果构建正确)只返回 400 ish 范围内的内容,例如错误请求。但是 500 靠近终点站,有什么东西撞到了他们身边。
  • @MurrayFoxcroft 不不,在我的控制之下!我要告诉你的是 webapi 没有错误!如果我在浏览器上调用这个 webapi(2),我得到了图像......但是如果调用一个调用这个 webapi(2) 的 webapi(1),我不明白。 IsSuccessStatusCode 为假,我收到错误 500。

标签: c# asp.net-web-api controller httpresponse


【解决方案1】:

错误是因为当你在浏览器上传递一个值时,它们会改变一些字符......所以,你传递了 2 个值......你必须使用

在 webapi 1 上

var MIRACLE =  Uri.EscapeDataString(exemplo);

在 webapi2

var MIRACLE2 = Uri.UnescapeDataString(MIRACLE)

【讨论】:

  • 是的。就是这样......这就是为什么当我只尝试 webapi 2 时,它正在工作......问题是当 webapi 处理 webapi2 时......一些特殊字符发生了变化,我收到 FALSE 到 IsSuccessStatusCode......谢谢!
【解决方案2】:

根据您的代码,web api 1 将仅接受媒体类型 = "application/json"。 这是因为您添加了以下代码:

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

所以要么删除这行代码,要么将其从“application/json”更改为“image/jpeg”。

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多