【问题标题】:Uploading image to WCF Api with RestSharp - Image not valid使用 RestSharp 将图像上传到 WCF Api - 图像无效
【发布时间】:2012-04-26 05:14:32
【问题描述】:

我已成功创建了一个应用程序,该应用程序将我的 Windows Phone 请求发送到托管在 azure Web 角色中的 WCF api。我正在使用 Restful POST 方法使用 RestSharp 执行此操作。这一切都很好,图像出现在存储中,但图像没有像普通图像文件一样打开。

将它们与我之前上传的其他图像进行比较,在元数据信息中它说不可见的图像有一个 contentMD5 字段,该字段设置为“AKEYWqGgulwi6/9/VY2KPg==”(而其他人没有)这可能是是什么导致文件出现问题?

我附上了我的 RestSharp 代码,也许我正在添加一些我不应该添加的东西?我怀疑这个错误一定来自这里,因为这是操纵图像流的唯一地方。

   public void SendRequest(Stream imageStream, string imageID)
    {
        var client = new RestClient();
        client.BaseUrl = apiAddress;
        var request = new RestRequest("agerecog/{imageName}", Method.POST);
        request.AddUrlSegment("imageName", imageID);

        //convert imagestream to byte array
        var byteArray = new byte[imageStream.Length];
        imageStream.Read(byteArray, 0, (int)imageStream.Length);

        //add byteArray to request
        request.AddFile("image/jpeg", byteArray, imageID);
        var url = client.BuildUri(request).ToString();
        client.ExecuteAsync<VizageResponse>(request, response =>
            {
                //request info. to be added here
            });
    }

编辑 #1 经过一番工作,我决定将 addFile 行更改为:

  request.AddFile(null, byteArray, null);

这改变了流的长度,也使 contentMD5 字段为空。但是,该图像仍然不是有效的图像文件。鉴于我要比较的图像都来自 Windows Phone 模拟器,它们都应该是相同的白页,角落有一个黑色小方块 - 但文件之间的大小不同(有效图像文件的长度为 5670 , 6076 长度为原始代码和 6239 长度使用上面的第二个 addFile)

编辑 #2 做一些更多的分析,当图像流被发送之前,它的长度属性是 6116,当它到达服务器时,它是 6370。264 是从我相信的 RestSharp 方法中的某个地方添加的,或者当数据流是在服务器端解释。 WCF服务的代码:

  [WebInvoke(UriTemplate = "/agerecog/{imageName}", Method = "POST")]
    VizageResult analyseFace(string imageName, Stream imageStream);

【问题讨论】:

  • 您能将请求与 Fiddler 进行比较吗?您可能还需要直接写入流的 AddFile 重载。
  • 感谢 John,很遗憾,我无法使用 fiddler,因为 azure 服务托管在我的本地开发环境中。然而,我已经做了一些调查工作,我将在上面的编辑中添加这些工作。我也会直接写到流中
  • 不幸的是,直接流式传输似乎也不起作用
  • 我认为它正在工作,但是我需要解析另一端的文件流,而我目前没有这样做 - 这将解释我认为流中的额外数据

标签: c# rest azure restsharp


【解决方案1】:

问题已解决

我终于解决了问题,最终结果是可以看到图像。发生的情况是 imageStream 还包含有关文件名称的数据,这导致它(当保存在 Azure 中时)不显示为图像文件。

我通过使用此处找到的 MultipartParser 类解决了这个问题:http://multipartparser.codeplex.com/ 在服务器端将请求解析为文件名和文件流块。然后我使用正常过程从这个字节[]中保存了图像。

我将 webrequest 数据解析为其组成部分的代码如下:

    MemoryStream imageStream = new MemoryStream();

     MultipartParser parser = new MultipartParser(dataStream);
        if (parser != null && parser.Success)
        {
            imageName = parser.Filename;
            imageStream.Write(parser.FileContents, 0, parser.FileContents.Length);
        }

当您使用内存流时,请记住将其位置设置回 0 - 我犯了一个小学生错误!

【讨论】:

  • 但是,如果我在 linux 机器上有 3rd 方网络服务,我该怎么办?!我认为它仍然是 restSahrp 错误。有人知道如何在请求发送之前修复 HTTP-body 吗???
  • 抱歉没有回复 - 不知道很遗憾
【解决方案2】:

我不太熟悉 RestSharp。你能确定MD5是正确的吗?尝试将 blob 中的数据与原始图像文件中的数据进行比较。例如,检查它们是否具有相同的大小,第一个/最后几个字节是否相同(并假设中间的字节也相同)。

【讨论】:

  • 谢谢,我现在就试试。我在上面做了一个编辑。将尝试和其他一些事情来找到问题的路径原因
猜你喜欢
  • 2012-07-02
  • 2012-03-03
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2019-04-17
  • 2015-11-24
相关资源
最近更新 更多