나는 이것을 디버그 모드에서 실행했고 예외의 세부 사항이있는 이미지를 첨부합니다. 무엇이 잘못되었는지 어떻게 알 수 있습니까? 테이블에 데이터를 삽입하려고했습니다. azure가 더 자세한 정보를 제공 할 수 없나요?
Obs : 스토리지가 내 컴퓨터가 아닌 Windows Azure에 있습니다. 테이블이 생성되었지만 데이터를 삽입 할 때이 오류가 발생합니다.
// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the table if it doesn't exist.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
table.CreateIfNotExists();
다음은 삽입 코드입니다.
public static void SetStatus(Employee e, bool value)
{
try
{
// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=###;AccountKey=###");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the CloudTable object that represents the "people" table.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
// Create a new customer entity.
if (value == true)
{
EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
empHistory.IsOnline = true;
empHistory.OnlineTimestamp = DateTime.Now;
TableOperation insertOperation = TableOperation.Insert(empHistory);
table.Execute(insertOperation);
}
else
{
TableQuery<EmployeeOnlineHistory> query = new TableQuery<EmployeeOnlineHistory>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, e.Id.ToString()));
EmployeeOnlineHistory entity = table.ExecuteQuery(query).Take(1).FirstOrDefault();
if ((entity!=null)&&(entity.IsOnline))
{
entity.IsOnline = false;
entity.OfflineTimestamp = DateTime.Now;
entity.OnlineTime = (entity.OfflineTimestamp - entity.OnlineTimestamp);
TableOperation updateOperation = TableOperation.Replace(entity);
table.Execute(updateOperation);
}
else
{
EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
empHistory.IsOnline = false;
empHistory.OfflineTimestamp = DateTime.Now;
TableOperation insertOperation = TableOperation.Insert(empHistory);
table.Execute(insertOperation);
}
}
}
catch (Exception ex)
{
//var details = new System.IO.StreamReader(((Microsoft.WindowsAzure.Storage.StorageException)ex)..Response.GetResponseStream()).ReadToEnd();
LogFile.Error("EmployeeOnlineHistory.setStatus",ex);
}
}
답변
400 오류는 속성 중 하나의 값에 문제가 있음을 의미합니다. 알아내는 한 가지 방법은 Fiddler를 통해 요청 / 응답을 추적하고 Windows Azure Storage로 전송되는 실제 데이터를 확인하는 것입니다.
대략적으로 추측 해보면 모델에 날짜 / 시간 유형 속성 (OfflineTimestamp, OnlineTimestamp)이 있고 특정 시나리오에서 그중 하나가 기본값으로 초기화되는 것을 관찰 한 것으로 코드를 훑어 보면서 가정하고 있습니다. ” DateTime.MinValue “입니다. 날짜 / 시간 유형 속성에 허용 되는 최소값 은 Windows Azure에서 1601 년 1 월 1 일 (UTC) 입니다 . [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] . 그렇지 않은지 확인하십시오. 이 경우 기본값으로 채워지지 않도록 nullable 형식 필드를 만들 수 있습니다.
아래 Juha Palomäki의 답변도 살펴보십시오 … 때로는 그가 제안하는 예외에 약간 더 유용한 메시지가 있습니다 (RequestInformation.ExtendedErrorInformation.ErrorMessage)
답변
StorageException에는 오류에 대한 좀 더 자세한 정보도 포함되어 있습니다.
디버거 체크인 : StorageException.RequestInformation.ExtendedInformation
답변
제 경우에는 RowKey의 슬래시 였습니다. .
또한 ‘OutOfRangeInput-요청 입력 중 하나가 범위를 벗어났습니다.’를 받았습니다. 스토리지 에뮬레이터를 통해 수동으로 추가하려고 할 때 오류가 발생했습니다.
키 필드에서 허용되지 않는 문자
다음 문자는 PartitionKey 및 RowKey 속성 값에 허용되지 않습니다
.
- 슬래시 ( / ) 문자
- 백 슬래시 ( \ ) 문자
- 숫자 기호 ( # ) 문자
- 물음표 ( ? ) 문자
- U + 0000에서 U + 001F 까지의 제어 문자 :
- 가로 탭 ( \ t ) 문자
- 줄 바꿈 ( \ n ) 문자
- 캐리지 리턴 ( \ r ) 문자
- U + 007F 에서 U + 009F 까지의 제어 문자
http://msdn.microsoft.com/en-us/library/dd179338.aspx
나는 이것을 처리하기 위해 확장 메소드를 작성했습니다.
public static string ToAzureKeyString(this string str)
{
var sb = new StringBuilder();
foreach (var c in str
.Where(c => c != '/'
&& c != '\\'
&& c != '#'
&& c != '/'
&& c != '?'
&& !char.IsControl(c)))
sb.Append(c);
return sb.ToString();
}
답변
나는 같은 문제에 직면했지만 내 경우의 이유는 크기 때문이었습니다. 추가 예외 속성 (RequestInformation.ExtendedErrorInformation)을 조사한 후 이유를 찾았습니다.
ErrorCode : PropertyValueTooLarge ErrorMessage : 속성 값이 최대 허용 크기 (64KB)를 초과합니다. 속성 값이 문자열 인 경우 UTF-16으로 인코딩되며 최대 문자 수는 32K 이하 여야합니다.
답변
글쎄, 제 경우에는 이렇게하려고했습니다.
CloudBlobContainer container = blobClient.GetContainerReference("SessionMaterials");
await container.CreateIfNotExistsAsync();
ContainerName SessionMaterials
(Pascal Case 및 Camel Case : D로 작성하는 습관) 때문에 400 개의 잘못된 요청이 발생했습니다. 그래서, 나는 그것을 만들어야합니다 sessionmaterials
. 그리고 그것은 작동했습니다.
이것이 도움이되기를 바랍니다.
추신 :-예외 http 응답을 확인하거나 피들러를 사용하여 요청 및 응답을 캡처하십시오.