【问题标题】:C# RestSharp PUT method and send raw bytes (protobuf)C# RestSharp PUT 方法并发送原始字节(protobuf)
【发布时间】:2023-04-08 08:43:01
【问题描述】:

如何使用 HTTP PUT 方法发送字节数组? RestRequest 类的方法 AddFile 发送额外的标头。 方法AddParameter 采用Object 类型。

我是怎么做的:

byte[] data;
using (var ms = new MemoryStream())
{
    Serializer.Serialize(ms, query);
    data = ms.ToArray();
    ms.Close();
}
var client = new RestClient(ServerPath);
var request = new RestRequest(RequestPath, Method.PUT);
request.AddFile("stream", x => new MemoryStream(data), string.Empty);
client.ExecuteAsync(request, responce => Debug.WriteLine(responce.Content));

但是在服务器端我看到了额外的标题

-------------------28947758029299 内容处置:表单数据;名称=“流”;文件名="" 内容类型:应用程序/八位字节流 [这里的原始数据] -------------------------------------------28947758029299--

额外的标题使查询不可读。我做错了什么?

【问题讨论】:

  • 服务器期望会是什么样子?有效载荷应该只是原始主体吗? AddFile suggests 的使用实际上是期望 multi-part ,但这与列出的内容类型/处置不匹配。例如,这是否像 WebClientclient.UploadData(address, "PUT", data); 一样简单?
  • 服务器期望只有原始数据,没有标题。如果我使用 request.AddObject(data) 服务器将其视为 Length=29&Rank=1&SyncRoot=System.Byte%5B%5D&IsReadOnly=False&IsFixedSize=True&IsSynchronized=False
  • 如果你没有标头,那么它听起来不像 HTTP...HTTP 有标头。标题的存在不应过度影响它。
  • 好的,我有第二个服务客户端,首先我为 android 编写,现在我为 WP8 编写,在 android HttpClient 上我看不到这个问题,但在 RestSharp 上是
  • 那么你需要检查 http 看看到底有什么不同。你也可以在 WP8 上使用 HttpClient (nuget.org/packages/Microsoft.Net.Http ?)

标签: c# protocol-buffers restsharp


【解决方案1】:

感谢 Marc Gravell。 解决方案:

        var client = new HttpClient();
        var httpContent = new ByteArrayContent(data);
        client.PutAsync(Path, httpContent);

【讨论】:

    【解决方案2】:

    我有时为此苦苦挣扎,终于找到了解决方案 神奇的是在没有参数名称的情况下作为请求体给出

    // file to send
    IFormFile file
    byte[] buffer;
    
    using (var ms = new MemoryStream())
    using (var stream = file.OpenReadStream())
    {
        stream.CopyTo(ms);
        buffer = ms.ToArray();
    }
    var uploadDoc = new RestRequest("ressource", Method.POST);
    uploadDoc.RequestFormat = DataFormat.None;
    uploadDoc.AddParameter("", buffer, ParameterType.RequestBody);
    
    var response = new RestClient("baseUrl").Execute(uploadDoc);
    

    希望对他人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2016-04-14
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多