Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从服务器返回的字节数组在客户端接收时是不同的_C#_Rest_Serialization_Bytearray_Asp.net Web Api - Fatal编程技术网

C# 从服务器返回的字节数组在客户端接收时是不同的

C# 从服务器返回的字节数组在客户端接收时是不同的,c#,rest,serialization,bytearray,asp.net-web-api,C#,Rest,Serialization,Bytearray,Asp.net Web Api,我有一个RESTAPI试图从我的web API调用(获取)字节数组。 这是我的客户代码: Uri uri = new Uri(URL); httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Binary")); HttpResponseMessage response

我有一个RESTAPI试图从我的web API调用(获取)字节数组。 这是我的客户代码:

Uri uri = new Uri(URL);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Binary"));
HttpResponseMessage response = await httpClient.GetAsync(uri + route + "?" + COMPANY_REF + "=" + ApplicationObject.CompanyRef);
response.EnsureSuccessStatusCode();
var result = response.Content.ReadAsByteArrayAsync().Result
这是我的服务器API:

[HttpGet]
public byte[] Get(Guid companyRef)
{
    Mapper.CreateMap<Services.Group,Models.Group>();
    var test = Mapper.Map<List<Models.Group>>(groupRepository.Get(companyRef));
    var t = Compression.Serialize(test);
    return t;
}


public static byte[] Serialize(this Object obj)
{
    if (obj == null)
    {
        return null;
    }

    using (var memoryStream = new MemoryStream())
    {
        var binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream, obj);
        var compressed = Compression.Zip(memoryStream.ToArray());

        return compressed;
    }
}
使用Fiddler,它似乎认为它需要Json。所以我把它改成了 “应用程序/json”

那没用

我还使用了base64Binary,这也不起作用

我还能试什么

其他: 在浏览器中直接键入api时的结果:

<base64Binary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z+YzdvrzuZEq7D8OI4BBXhCugH+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==
</base64Binary>
为此:

var result = response.Content.ReadAsStringAsync().Result;
byte[] resultFromServer = Encoding.ASCII.GetBytes(result);
byte[] actualBytes = Convert.FromBase64String(Encoding.ASCII.GetString(resultFromServer));
我得到一个错误:

输入不是有效的Base-64字符串,因为它包含一个非Base-64字符、两个以上的填充字符或填充字符中的非法字符。

这就是结果的价值

“H4SIAAAAAAAAEAKWS32VUQBDHN3U5TXJRUSR1B4PBX49G/4CDLHB64K9DQ304JWXTK/rbXePb CKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQ xPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+TXAVN6B7VGVIK7J0EAYKK +fKle93ZlM/hRKn9kCNAaUtl4Ok/9TYDRTYQDCKMZA9VTHYCU788Z +YzdvrzuZEq7D8OI4BBXhCugH +ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qq 政府5PNF7BSRW4ZLICCZWXAJXJ5WOEFYLEVEF5TSUF +zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//G11F6E1QLGY1MNJ3LMWLZFD aZM6puYFC3GzRQUN/66K3ELFEOY41ELCHVVAXD2HWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/h Q4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==”

从Debug.Write:

"这一数字是一个中国的一个AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQXSP/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//G11F6E1QGy1NnJ3LmZfDazzm6Puyfc3Gzrqun/66k3ElfEyvvax2Hwy/BFMRmXD0WgJxoly70HQf7M5WmU/HQ4U4UoQ4H9HMX+OAidQwBbBbKbKbKbF4KbKbKbJ9KbJ9KbJ4UoE9KbJJ9FfA=”FbJ

为了使这最终起作用,我必须这样做:

byte[] actualBytes = Convert.FromBase64String(result2.Replace("\"",""));

谢谢

因为您得到的是字符串形式的响应,只需解码Base64字符串即可

var result=response.Content.ReadAsStringAsync().result;
字节[]实际字节=Convert.FromBase64String(结果);

经过一些研究,我发现asp net核心团队不想解决这个问题(),要解决您的问题,您必须返回“FileStreamResult”

使用此选项更改控制器

[HttpGet]
public FileStreamResult Get(Guid companyRef)
{
    Mapper.CreateMap<Services.Group, Models.Group>();
    var test = Mapper.Map<List<Models.Group>>(groupRepository.Get(companyRef));
    var t = Compression.Serialize(test);
    return File(new MemoryStream(t), "application/octet-stream");
}
[HttpGet]
公共文件流结果获取(Guid companyRef)
{
CreateMap();
var test=Mapper.Map(groupRepository.Get(companyRef));
var t=压缩.序列化(测试);
返回文件(新内存流(t),“应用程序/八位字节流”);
}

您是否考虑过将生成的字节数组转换为uft-8字符串,或者只是将内容作为字符串读取?也许我们的代码中隐藏了一些信息there@RX_DID_RX您好,感谢您对我的同情。我已经编辑了我的问题,以显示如果我直接在浏览器中键入api会发生什么。我当然会按照您的建议转换为utf-8,并进行重新编辑我回来了。thanks@RX_DID_RX我从utf-8得到的所有信息都与附加信息相同:(嗨,我得到了一个更奇怪的结果。我将编辑我的问题来解释,但我可以成功地得到实际字节,并且可以看到它与您的字节[]相同从web服务器发送。编辑帖子后,我复制了base64内容并将其分配给result,但仍然成功。好的,现在您已经将结果作为字符串获取,然后您只能对其进行解码。这就是我所说的“怪异”。复制并粘贴该字符串,它可以工作,但直接从结果变量读取它不会工作。必须有在复制和粘贴的过程中进行一些转换。已经在谷歌上搜索了一段时间。为什么是我?那么结果变量中必须有一些额外的字符。你能用Debug.Write转储它吗?
byte[] actualBytes = Convert.FromBase64String(result2.Replace("\"",""));
[HttpGet]
public FileStreamResult Get(Guid companyRef)
{
    Mapper.CreateMap<Services.Group, Models.Group>();
    var test = Mapper.Map<List<Models.Group>>(groupRepository.Get(companyRef));
    var t = Compression.Serialize(test);
    return File(new MemoryStream(t), "application/octet-stream");
}