C#:字节0不会被识别为空值

时间:2018-07-31 09:33:19

标签: c# iis

我正在通过后请求将数据发送到IIS。一切工作正常,但现在我意识到我无法向IIS发送空值。无论我做什么,响应数据都不会被识别为空。

这是Wireshark嗅到的后数据:

Encapsulated multipart part: 
Content-Disposition: form-data; name="@Beschreibung"\n\r\n
Data (1 byte)
Data: 00
[Length: 1]
Boundary: \r\n--*****\r\n

这是我的IIS网络方法中的代码:

            HttpContext postedContext = HttpContext.Current;

            var bytes = Encoding.Default.GetBytes(postedContext.Request.Form["@Beschreibung"]);

            var beschreibung = Encoding.UTF8.GetString(bytes);
            log.Info("BYTE ARRAY START");
            foreach (byte b in bytes)
            {
                log.Info(b);
            }
            log.Info("BYTE ARRAY ENDE");

            log.Info("Beschreibung: |" + beschreibung + "|");
            if (beschreibung == null)
                log.Info("IST NULL");

            if (string.IsNullOrEmpty(beschreibung))
                log.Info("IST NULL OR EMPTY");

            if (string.IsNullOrWhiteSpace(beschreibung))
                log.Info("IST NULL OR WHITESPACE");

和日志输出:

2018-07-31 10:59:09,826 [24] INFO - BYTE ARRAY START
2018-07-31 10:59:09,826 [24] INFO - 0
2018-07-31 10:59:09,826 [24] INFO - BYTE ARRAY ENDE
2018-07-31 10:59:09,826 [24] INFO - Beschreibung: | |

如您所见,whireshark中的数据仅为一个字节,即为0。在我的web方法中,C#代码中数据的字节数组表示仍然仅为一个字节,即为0。 但是字符串本身不为null,也不为空字符串,甚至也不是空格,因为该代码不会运行到单个if语句中。

我在这里想念什么?我需要将此字符串识别为null,因此可以在数据库中而不是“”或“”中写入DBNull.Value。

感谢您的帮助,谢谢。

编辑: 知道了Null是有效的字符。 这是发送站点(在Xamarin.iOS中),我可能最好开始一个新主题,并询问Xamarin伙计们如何发送空值。

var postBody = new NSMutableData();
        postBody.AppendData(new NSString(twoHyphens + boundary + lineEnd).Encode(NSStringEncoding.UTF8));
        postBody.AppendData(new NSString("Content-Disposition: form-data; name=\"@Beschreibung\"" + crlf).Encode(NSStringEncoding.UTF8));
        postBody.AppendData(new NSString(lineEnd).Encode(NSStringEncoding.UTF8));
        postBody.AppendData(new NSString("\0").Encode(NSStringEncoding.UTF8));
        postBody.AppendData(new NSString(lineEnd).Encode(NSStringEncoding.UTF8));
        postBody.AppendData(new NSString(twoHyphens + boundary + lineEnd).Encode(NSStringEncoding.UTF8));

在第5行中,我将数据发送为“ \ 0”。 之前我用

发送
byte zero = 0;
postbody.AppendBytes(new byte[]{zero};

所以只发送一个字节0,但这当然是同样的问题...

2 个答案:

答案 0 :(得分:3)

这是因为字符串既不为null也不为空。它包含一个字符('\ 0')

空('\ 0')是完全可以的字符,因此此行为是正确的。

您可以通过将字符串与beschreibung == "\0"进行比较来进行测试

托马斯

答案 1 :(得分:0)

如果您要发送一个空字符串-请发送一个空字符串:

postBody.AppendData(new NSString("").Encode(NSStringEncoding.UTF8));

正如我在另一条评论中所说,“字符串是由空字符结尾的字符数组”是的((特征/错误)),并且 most 的最新语言都认识到空字符是完全有效的字符串之内。