在.netcore2.1 Web-api

时间:2019-01-11 18:24:35

标签: c# asp.net asp.net-web-api asp.net-core-2.1

我正在.net core 2.1(C#)中做一个Web-api,但在POST请求中发送重音字符时遇到了问题。

到目前为止,我已经尝试了两种不同的方法:构建将使用FormUrlEncodedContent和StringContent发布的内容。我使用了https://pt.stackoverflow.com/questions/121713/applicationx-www-form-urlencoded-com-httpwebrequest中的引用(葡萄牙语)。 我猜出于某种原因我在使用UTF-8编码时遇到了麻烦。

使用FormUrlEncodedContent:

        var values = new List<KeyValuePair<string, string>>();
        object[] myKeys = new object[content.DsValues.Count];
        object[] myValues = new object[content.DsValues.Count];

        content.DsValues.Keys.CopyTo(myKeys, 0);
        content.DsValues.Values.CopyTo(myValues, 0);

        foreach (object value in myValues)
        {
            values.Add(new KeyValuePair<string, string>("value", value.ToString()));
        }

        foreach (object key in myKeys)
        {
            values.Add(new KeyValuePair<string, string>("field", key.ToString()));
        }

        values.AddRange(content.Values);

        var string_message = new FormUrlEncodedContent(values).ReadStringAsync();

        var postRequest = Encoding.UTF8.GetBytes(string_message);
        request.ContentLength = postRequest.Length;
        var stream = request.GetRequestStream();
        stream.Write(postRequest, 0, postRequest.Length);
        stream.Close();

使用StringContent:

        var formurlstring = "";
        foreach(object value in myValues)
        {
            formurlstring = formurlstring + "value=" + value.ToString() + "&";
        }

        foreach(object key in myKeys)
        {
            formurlstring = formurlstring + "field=" + key.ToString() + "&";
        }

        var encoded = formurlstring.Replace(" ", "+");
        var string_message = new StringContent(HttpUtility.UrlEncode(encoded));


        var postRequest = Encoding.UTF8.GetBytes(string_message);
        request.ContentLength = postRequest.Length;
        var stream = request.GetRequestStream();
        stream.Write(postRequest, 0, postRequest.Length);
        stream.Close();

据我检查,FormUrlEncodedContent返回的字符串具有重音字符,而我从StringContent中恢复的字符串仍然具有重音字符。我可以将它们都发布到外部的Web应用程序中,但是每当我检查发布的内容时,带重音的字符都是不正确的。我会期望像这样:

COMESTÍVEL

但是,每当我在网站上查看时,已发布的内容如下: COMESTÃVEL

在此先感谢您的答复,如果我忘记了一些有关代码的信息,对不起。

2 个答案:

答案 0 :(得分:0)

确保您的帖子请求的UIColor标头具有包含UIColor的mime类型。现在,它被解释为ASCII(latin-1)。

答案 1 :(得分:0)

我终于调试了它。

因此,由于我使用的是ISO-8859-1,因此我不得不将其编码方法更改为它。每当我尝试使用FormUrlEncodeContent或StringContent创建要上传的内容时,使用的编码都不正确。

因此,我没有使用这些方法来创建我的内容,而是在循环中进行了处理并发送回纯字符串,然后使用正确的编码方法对其进行了编码。

var formurlstring = "";
        foreach(object value in myValues)
        {
            formurlstring = formurlstring + "value=" + value.ToString() + "&";
        }

        foreach(object key in myKeys)
        {
            formurlstring = formurlstring + "field=" + key.ToString() + "&";
        }

        var string_message = formurlstring.Replace(" ", "+");

        var enc8859 = Encoding.GetEncoding(28591);
        var postRequest = enc8859.GetBytes(string_message);
        request.ContentLength = postRequest.Length;
        var stream = request.GetRequestStream();
        stream.Write(postRequest, 0, postRequest.Length);
        stream.Close();

可能有更好的方法。我确实想将其与FormUrlEncodedContent一起使用,它更简单,更简洁,但是由于我无法...