【问题标题】:ASP.NET Web API does not allow Lengthy base64 URIASP.NET Web API 不允许冗长的 base64 URI
【发布时间】:2015-10-05 22:55:54
【问题描述】:

我正在尝试从我的 Android 客户端接收一个冗长的 base64 字符串,然后将其解码为我的 Web API 项目中的位图,以作为图像上传到 Azure BLOB 存储。但是,项目返回此消息并拒绝接受参数:

请求网址过长

HTTP 错误 414。请求 URL 太长。

显然 base64 字符串很长。我如何解决这个问题并接受参数?我在堆栈中查看了类似的问题,但没有一个答案清楚地说明如何在 Web API 中修复它。谢谢!

这是我方法中的代码 sn-p:

[HttpPost]
[Route("api/addnewpost")]
public IHttpActionResult AddNewMediaActivity(string base64String, string caption, string email, string type)
{
            byte[] f = Convert.FromBase64String(base64String);
            //more code........
}

我在 Android 上的客户端代码:

HttpClient hc = new DefaultHttpClient();
String message;

HttpPost p = new HttpPost("http://mymobileaddress.azure-mobile.net/api/addactivity?base64String=" + image + "&caption=" + caption + "&email=" + email + "&type=" + type );
JSONObject object = new JSONObject();
try {
            object.put("base64String", image);
            object.put("email", image);
            object.put("base64String", image);

} catch (Exception ex) {

}

try {
           message = object.toString();

            p.setEntity(new StringEntity(message, "UTF8"));
            p.setHeader("Content-type", "application/json");
            p.setHeader("ACCEPT", "application/json");
            p.setHeader("X-ZUMO-APPLICATION", mobileServiceAppId);
            HttpResponse resp = hc.execute(p);
            if (resp != null) {
                if (resp.getStatusLine().getStatusCode() == 204)
                {

                }
            }

            Log.d("ER", "" + resp.getStatusLine().getStatusCode());
        } catch (Exception e) {
            e.printStackTrace();

        }

【问题讨论】:

  • @Zaki 不走运。不工作:(
  • 正常的方式是通过 body 发布数据 .... 而不是通过 url ...
  • @Selvin 请解释一下,我对这些东西有点落后,我不知道:(
  • 嗯,这都是互联网上成千上万的例子......搜索 FromBody 属性

标签: asp.net web-services asp.net-web-api


【解决方案1】:

(我已经删除了另一个,我想保留这个,因为问题是使用 asp.net 5 beta 8 并且是更新的)

我最近遇到了这个问题,参数被移动到从 Body 接收一个 byte[](字节数组)

首先我尝试从正文中收到字符串,但字符串被截断,无法在服务器端重新创建文件。

在我的应用程序中,base64 来自从输入文件创建的数组缓冲区的转换。

base64 是从 angular 以 json 格式发送的。

【讨论】:

    【解决方案2】:

    数据可以在请求的 URL 中传输,也可以在正文中传输。您当前正在传输 URL 中的数据。并且 URL 只允许是有限长度。相反,将您的 base64 字符串放在正文中。见Parameter Binding in ASP.NET Web API

    默认情况下,从 URI 中提取字符串等简单参数。为了强制 Web API 在正文中查找它,我们在参数中添加了 [FromBody] 属性。

    [HttpPost]
    [Route("api/addnewpost")]
    public IHttpActionResult AddNewMediaActivity(string caption, string email,
        string type, [FromBody] string base64String)
    {
        byte[] f = Convert.FromBase64String(base64String);
        //more code........
    }
    

    并更改您的 Android 客户端代码,将 base64 字符串放在正文中,而不是 URL。自从我接触 Java 已经有一段时间了,我不知道您使用的是什么库,但我想当您构建 HTTP 请求时,您可以选择将一些数据添加到请求。

    【讨论】:

    • 啊,伙计,您的回答看起来像是真正的交易,但我很难找到一种通过客户端的正文发布 base64 的方法。我会接受这个,但是如果你知道在 android 中发布 base64 字符串的方法,请告诉我:)
    • @Earthling 我需要知道您使用什么 Java 库来发送 HTTP 请求。
    • 我正在使用 apache HttpClient,伙计
    • @Earthling This HttpClient?请将生成 HTTP POST 请求的相关 Android 代码编辑到您的问题中。 this answer 有帮助吗?
    猜你喜欢
    • 2018-02-04
    • 2012-12-28
    • 2018-05-27
    • 1970-01-01
    • 2013-12-25
    • 2021-09-30
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多