Azure上的http http-put UnityWebRequest

时间:2016-12-01 11:42:22

标签: android azure unity3d httpwebrequest http-put

我正在尝试将视频上传到私有Azure blob。 UnityWebRequest在PC上完美运行,但一旦它在Android设备上构建,它就会一直返回403错误。

为了调试我尝试在Android设备上使用正常的HttpWebRequest,使用相同的设置,这很好。切换到HttpWebRequest不是一个选项。

我想知道HttpWebRequest是否有一些UnityWebRequest没有的默认选项,或者是否有人知道其他问题?

HttpWebRequest:适用于两个设备

如有必要,我可以提供代码。

[更新]

public IEnumerator PutBlob(string filePath, string blockBlobReference)
{
    String httpMethod = "PUT";

    Byte[] blobContent = File.ReadAllBytes(filePath);

    Int32 blobLength = blobContent.Length;

    const String blobType = "BlockBlob";

    String urlPath = String.Format("{0}/{1}", AzureStorageConstants.container, blockBlobReference);
    String msVersion = "2009-09-19";
    //String msVersion = "2015-02-21";
    String dateInRfc1123Format = DateTime.UtcNow.AddHours(1).ToString("R", CultureInfo.InvariantCulture);

    String canonicalizedHeaders = String.Format("x-ms-blob-type:{0}\nx-ms-date:{1}\nx-ms-version:{2}", blobType, dateInRfc1123Format, msVersion);
    String canonicalizedResource = String.Format("/{0}/{1}", AzureStorageConstants.Account, urlPath);
    String stringToSign = String.Format("{0}\n\n\n{1}\n\n\n\n\n\n\n\n\n{2}\n{3}", httpMethod, blobLength, canonicalizedHeaders, canonicalizedResource);
    String authorizationHeader = CreateAuthorizationHeader(stringToSign);

    Uri uri = new Uri(AzureStorageConstants.BlobEndPoint + urlPath);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = httpMethod;
    request.Headers.Add("x-ms-blob-type", blobType);
    request.Headers.Add("x-ms-date", dateInRfc1123Format);
    request.Headers.Add("x-ms-version", msVersion);
    request.Headers.Add("Authorization", authorizationHeader);
    request.ContentLength = blobLength;

    ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(blobContent, 0, blobLength);
        yield return requestStream;
    }

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        String ETag = response.Headers["ETag"];
    }
}

UnityWebRequest:适用于计算机,但不适用于Android

public IEnumerator PutBlob(string filePath, string blockBlobReference)
{
    String httpMethod = "PUT";

    Byte[] blobContent = File.ReadAllBytes(filePath);

    Int32 blobLength = blobContent.Length;

    const String blobType = "BlockBlob";

    String urlPath = String.Format("{0}/{1}", AzureStorageConstants.container, blockBlobReference);
    String msVersion = "2009-09-19";
    //String msVersion = "2015-02-21";
    String dateInRfc1123Format = DateTime.UtcNow.AddHours(1).ToString("R", CultureInfo.InvariantCulture);

    String canonicalizedHeaders = String.Format("x-ms-blob-type:{0}\nx-ms-date:{1}\nx-ms-version:{2}", blobType, dateInRfc1123Format, msVersion);
    String canonicalizedResource = String.Format("/{0}/{1}", AzureStorageConstants.Account, urlPath);
    String stringToSign = String.Format("{0}\n\n\n{1}\n\n\n\n\n\n\n\n\n{2}\n{3}", httpMethod, blobLength, canonicalizedHeaders, canonicalizedResource);
    String authorizationHeader = CreateAuthorizationHeader(stringToSign);

    Uri uri = new Uri(AzureStorageConstants.BlobEndPoint + urlPath);

    ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;

    using (UnityWebRequest webRequest = new UnityWebRequest())
    {
        webRequest.SetRequestHeader("x-ms-blob-type", blobType);
        webRequest.SetRequestHeader("x-ms-date", dateInRfc1123Format);
        webRequest.SetRequestHeader("x-ms-version", msVersion);
        webRequest.SetRequestHeader("Authorization", authorizationHeader);

        UploadHandler uploadHandler = new UploadHandlerRaw(blobContent);
        webRequest.uploadHandler = uploadHandler;
        uploadHandler.contentType =
        webRequest.url = uri.ToString();
        webRequest.method = httpMethod;
        webRequest.Send();


        while (!webRequest.isDone)
        {
            ProgressBar = webRequest.uploadProgress;
            yield return null;
        }
    }
}

0 个答案:

没有答案