あなたが提供したコードに基づいて、私は私の側でテストし、この問題を再現しました。あなたがコードをデバッグする場合は、次のように詳細なエラーを見つけることができる:
私の知る限りでは、いくつかの共通のヘッダーが制限みなされ、システムによって保護されており、Aに設定または変更することはできませんWebHeaderCollection
オブジェクトの場合は、このtutorialに従うことができます。
簡単な方法として、目的を達成するためにWebClient
の代わりにHttpWebRequest
を使用することをお勧めします。ここでは、RESTful APIを使用してプールを作成するためのテストコードを示します。
public static void CreatePoolViaRestAPI(string baseUrl, string batchAccountName, string batchAccountKey,string jsonData)
{
string verb = "POST";
string apiVersion= "2016-07-01.3.1";
string ocpDate= DateTime.UtcNow.ToString("R");
string contentType = "application/json; odata=minimalmetadata; charset=utf-8";
string reqUrl = string.Format("{0}/pools?api-version={1}", baseUrl, apiVersion);
//construct the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(reqUrl);
request.Method = verb;
//Set ContentType
request.ContentType = contentType;
//Set ocp-date
request.Headers.Add("ocp-date", ocpDate);
var buffer = Encoding.UTF8.GetBytes(jsonData);
request.ContentLength = buffer.Length;
#region generate the signature
string CanonicalizedHeaders = string.Format("ocp-date:{0}", ocpDate);
string CanonicalizedResource = string.Format("/{0}/pools\napi-version:{1}", batchAccountName, apiVersion);
string stringToSign = string.Format("{0}\n\n\n{1}\n\n{2}\n\n\n\n\n\n\n{3}\n{4}",
verb,
buffer.Length,
contentType,
CanonicalizedHeaders, CanonicalizedResource);
//encode the stringToSign
string signature = EncodeSignStringForSharedKey(stringToSign, batchAccountKey);
#endregion
//Set Authorization header
request.Headers.Add("Authorization", string.Format("SharedKey {0}:{1}", batchAccountName, signature));
using (var rs = request.GetRequestStream())
{
rs.Write(buffer, 0, buffer.Length);
}
//send the request and get response
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Console.WriteLine("Response status code:{0}", response.StatusCode);
}
}
注:cloudServiceConfigurationとvirtualMachineConfiguration特性が相互に排他的であり、特性のいずれか一方のみを指定することができます。いずれも指定されていない場合、バッチ・サービスはBad Request(400)を返します。したがって、次のように、上記の関数でjsonDataパラメータは次のようになります。
"{\"id\":\"DotNetPool\",\"vmSize\":\"small\",\"cloudServiceConfiguration\":{\"osFamily\":\"4\"}}"
UPDATE:
public string EncodeSignStringForSharedKey(string stringToSign, string accountKey)
{
HMACSHA256 h = new HMACSHA256(Convert.FromBase64String(accountKey));
var byteArray = h.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
string signature = Convert.ToBase64String(byteArray);
return signature;
}
詳細をあなたは次のようにstringToSignを符号化するための
方法は次のようになりますはAuthentication via Shared Keyに続く可能性があります。
この問題は解決しましたか?どんな更新? –