C# Softlayer对象存储ETag MD5校验和计算

C# Softlayer对象存储ETag MD5校验和计算,c#,ibm-cloud-infrastructure,C#,Ibm Cloud Infrastructure,我试图弄清楚在将数据传递到Softlayer对象存储时如何计算正确的校验和 我知道ETag是个问题,因为如果我从请求中删除它,它就可以工作,但是我更愿意使用它来验证上传是否损坏 这是我的方法: public bool SaveFile(byte[] file, eFetchStorageContainers container, string internalFileName, string fileName = "", bool overPublicNetwork = false)

我试图弄清楚在将数据传递到Softlayer对象存储时如何计算正确的校验和

我知道ETag是个问题,因为如果我从请求中删除它,它就可以工作,但是我更愿意使用它来验证上传是否损坏

这是我的方法:

    public bool SaveFile(byte[] file, eFetchStorageContainers container, string internalFileName, string fileName = "", bool overPublicNetwork = false)
    {
        Authenticate(overPublicNetwork);

        client = new RestClient(storage_url);
        var resourcePath = string.Format("/{0}/{1}", container, internalFileName);
        var req = new RestRequest(resourcePath, RestSharp.Method.PUT);

        req.AddHeader("X-Auth-Token", auth_token);
        req.AddFile(internalFileName, file, fileName);

        var md5Checksum = BitConverter.ToString(MD5.Create().ComputeHash(file)).Replace("-", string.Empty).ToLower();
        req.AddHeader("ETag", md5Checksum);

        var resp = client.Execute(req);

        return false;
    } 
以下是ETag的定义:

我相信问题在于我得到的是文件的校验和,而不是请求主体

  • 我想验证我是否应该获取请求主体的校验和,而不仅仅是文件

  • 如果以上是真的,我甚至不知道如何获得身体的校验和-希望得到一些指导

  • 嗯,我没有使用C#,但对我来说使用curl很好。我得到了文件的校验和,它工作正常。 以防万一,这里有一些例子

    确保您的请求与上面链接的示例类似

    这是我使用的卷曲:


    curl-X PUT-T“C:\Users\ncabero\Downloads\picture.jpg“-H”X-Auth-Token:Auth_uuxxxxxxx“-H”Etag:a43bf68dd35599a7873c12128f71b1f4”

    我实际上明白了这一点,我使用的是RestSharp,但是它不可能获得请求体

    我转到HttpClient,并能够访问请求主体以创建校验和

    var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Add("X-Auth-Token", auth_token);
    var bytes = new ByteArrayContent(file);
    var formData = new MultipartFormDataContent();
    formData.Add(bytes, internalFileName, internalFileName);
    
    // this creates a checksum to send over for verification of non corrupted transfers
    // this is also prevents us from using RestSharp due to its inability to create a checksum of the request body prior to sending
    var md5Checksum = BitConverter.ToString(MD5.Create().ComputeHash(formData.ReadAsByteArrayAsync().Result)).Replace("-", string.Empty).ToLower();
    httpClient.DefaultRequestHeaders.Add("ETag", md5Checksum);
    
    var url = string.Format("{0}/{1}{2}/{3}", storage_url, containerName, folderId, internalFileName);
    var resp = httpClient.PutAsync(url, formData).Result;
    
    httpClient.Dispose();