Azure 테이블 저장소에서 400 Bad Request가 반환됨
디버깅 모드로 실행했기 때문에, 예외의 상세를 포함한 이미지를 첨부합니다.뭐가 잘못됐는지 어떻게 알아?나는 테이블에 데이터를 삽입하려고 했다.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 스토리지로 전송되는 실제 데이터를 확인하는 방법이 있습니다.
대략적인 추측을 해보면 모델에 날짜/시간 유형 속성(OfflineTimestamp, OnlineTimestamp)이 있고, 특정 시나리오에서 그 중 하나가 기본값인 "날짜 시간"으로 초기화되는 것을 알 수 있을 것입니다.최소값"입니다.Windows Azure [ http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx ]에서 날짜/시간 유형 속성에 허용되는 최소값은 1601년 1월 1일(UTC)입니다.그렇지 않은지 알아봐 주세요.이 경우 기본값으로 채워지지 않도록 null 유형 필드를 만들 수 있습니다.
아래 Juha Palomaeki의 답변도 보세요.(RequestInformation)을 제안하는 예외에는 조금 더 유용한 메시지가 있을 수 있습니다.Extended Error Information(확장 오류 정보).Error Message)
스토리지예외에는 오류에 대한 자세한 정보도 포함되어 있습니다.
디버거 체크인:보관소예외.Request Information(요청 정보).확장 정보

내 경우 RowKey의 슬래시입니다.
또한 스토리지 에뮬레이터를 통해 수동으로 추가하려고 할 때 'Out Of Range Input - One is out of range' 오류가 발생하였습니다.
키 필드에 허용되지 않는 문자
PartitionKey 및 RowKey 속성 값에는 다음 문자를 사용할 수 없습니다.
- 슬래시(/) 문자
- 백슬래시(\) 문자
- 숫자 기호(#) 문자
- 물음표(?) 문자
- 다음을 포함하여 U+0000 ~ U+001F 문자를 제어합니다.
- 가로 탭(\t) 문자
- 줄바꿈 문자(\n)
- 캐리지 리턴(\r) 문자
- U+007F ~ U+009 문자 제어에프
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)을 조사하면 됩니다.Extended Error Information)에서 원인을 찾았습니다.
오류 코드: 속성 값 너무 큰 오류 메시지:속성 값이 최대 허용 크기(64KB)를 초과합니다.속성 값이 문자열일 경우 UTF-16으로 인코딩되며 최대 글자 수는 32K 이하여야 합니다.
제 경우엔 이렇게 하려고 했어요
CloudBlobContainer container = blobClient.GetContainerReference("SessionMaterials");
await container.CreateIfNotExistsAsync();
Name 컨테이너 이름 SessionMaterials(파스칼 케이스) 카멜 케이스:D에서 습관적으로 쓰면서) 400개의 불량 요청을 야기했습니다.저는 래래 it it it it it it it it it so로 만들면 요.sessionmaterials있었어그리고 그것은 성공하였다.
이게 도움이 됐으면 좋겠네요.
PS:- 예외 http 응답을 확인하거나 피들러를 사용하여 요청과 응답을 캡처합니다.
내 경우: 컨테이너 이름은 대문자로 되어 있습니다.문자 사용에는 제한이 있습니다.
당신의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★partitionKey ★★★★★★★★★★★★★★★★★」rowKeyNULL
(저도 마찬가지였습니다)
모든 테이블 서비스 오류 코드에 대한 MS의 문서는 여기에서 찾을 수 있습니다.
(400) Bad Request, Status Message:가 수신되었습니다.잘못된 요청, 오류 코드:엔티티에 DateTime 속성이 설정되지 않은 경우 OutOfRangeInput(OutOfRangeInput)(= DateTime).최소값)
같은 BadRequest(400) 에러가 발생했습니다.마지막에는 수동으로 입력합니다.
그리고 날 위해 일했어이게 도움이 됐으면 좋겠네요!
저도 같은 문제에 직면했습니다. 경우 않기 은 늘입니다 PartitionKey 값은 늘이 되었습니다.★★★★★★★★★★★★★★★★★★·Object reference not set to an instance of an object..
PartitionKey 또는 RowKey에 적절한 값을 제공하고 있는 경우는, 이러한 문제에 직면할 가능성이 있습니다.
케이스를 고쳤더니 잘 됐어요
내 경우:
- 행 키의 형식이 잘못되었습니다(400).
- 파티션 키와 rowkey의 조합은 고유하지 않습니다(409).
ZRS(Zone Redundant Storage)를 사용 중이었기 때문에 400개의 잘못된 요청을 받았는데, 이러한 유형의 스토리지에는 분석을 사용할 수 없습니다.Analytics를 사용하고 있는지 몰랐습니다.
저장용기를 삭제하고 GRS로 재작성하여 정상적으로 동작하게 되었습니다.
내 경우:하이픈이 포함된 태그 이름에 blob 메타데이터를 포함했습니다.
var blob = container.GetBlockBlobReference(filename);
blob.Metadata.Add("added-by", Environment.UserName);
//.. other metadata
blob.UploadFromStream(filestream);
대시인"added-by"이 문제가 있었습니다.나중에 RTFM에서 태그명은 C# 식별자 규약에 준거해야 한다고 합니다.
참고 자료: https://learn.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
언더스코어는 올바르게 동작.
이 경우 엔티티 클래스에 PartitionKey 및 Rowkey를 추가하지 않아야 합니다.기본 클래스여야 합니다.아래가 좋을 것 같습니다.
public class TableRunLogMessage:TableEntity
{
public string status { get; set; }
public long logged { get; set; }
public TableRunLogMessage() { }
}
NodeJS를 사용하다가 우연히 이 게시물을 발견했을 때 오류 오브젝트에 상세 정보가 표시되지 않는 경우 프록시를 사용하여 상세 정보를 얻을 수 있습니다.그러나 여기에서는 프록시 사용법에 대해 언급하지 않았기 때문에
노드를 사용하는 가장 간단한 방법JS는 다음 두 가지 환경 변수를 설정합니다.
NODE_TLS_REJECT_UNAUTHORIZED=0
This disables SSL checks so you can intercept your own SSL requests. This leaves you open to Man-in-The-Middle attacks and should NEVER make it to production, and I wouldn't even leave it in development for long. However, it will allow you to intercept the HTTP Requests.
HTTP_PROXY=http://127.0.0.1:8888
This sets node to utilize a proxy listening on your localhost at port 8888. Port 8888 is the default for Fiddler. Many other proxies default to 8080.
실제로 C#을 사용하고 있는 경우는, 이 투고의 작성자와 같이, 간단하게 Fiddler 를 인스톨 해, 인터셉트 하도록 설정할 수 있습니다.디폴트로는 요구를 대행 수신합니다.또한 Fiddler의 인증서를 신뢰하거나 노드의 "NODE_TLS_REJECT_UNAUTHED=0"과 동등한 작업을 수행해야 할 수도 있습니다.
Azure Storage Account Table API에서 400-BadRequest 응답을 받았습니다.예외 정보는 "액세스 중인 계정이 http를 지원하지 않습니다."로 표시되었습니다.아래
그림과 같이 스토리지 계정 구성에서 "Secure transfer required"가 활성화되어 있는 경우 연결 문자열에 https를 사용해야 한다고 생각했습니다.
내 경우 "TableBotDataStore" 클래스(MS 봇 프레임워크)의 새로운 설치를 만들기 위해 "tableName" 파라미터를 "master-bot"과 같은 하이픈과 함께 전달하며 TableBotDataStore는 문자와 숫자만 사용하여 테이블 이름을 가질 수 있습니다.
저도 같은 문제가 있었습니다. 함수가 이 기능을 통과하고 있었습니다.containerNameKey아래는 에러를 준 코드입니다.
container = blobClient.GetContainerReference(containerNameKey)
로 바꿨습니다.
container = blobClient.GetContainerReference(ConfigurationManager.AppSettings(containerNameKey).ToString())
효과가 있었다
문자열 필드에 너무 긴 값을 입력하려고 하면 400-BadRequest 응답이 수신되었습니다.
UTF-16 인코딩 값.문자열 값은 최대 64KiB입니다.지원되는 최대 글자 수는 약 32K 이하입니다."
저는 테이블 이름에 대시 예를 사용하여 tablename: "table-1234"를 사용했지만, tablename: "table1234"는 대시 기능을 하지 않았습니다.
저는 "#" 문자가 포함된 PartitionKey/RowKey를 사용하여 Azure 스토리지 테이블에 엔티티를 삽입하려고 했습니다.싱글 테이블 설계에서 구분 기호로 "#"을 사용하는 것이 일반적이기 때문에 이 방법은 허용되지 않습니다.
언급URL : https://stackoverflow.com/questions/14859405/azure-table-storage-returns-400-bad-request
'programing' 카테고리의 다른 글
| 제품 ID별로 woocommerce 리뷰를 받아 템플릿으로 표시하고 싶다. (0) | 2023.03.03 |
|---|---|
| JSONPath를 사용하여 JSON 개체에서 단일 값 가져오기 (0) | 2023.03.03 |
| reactjs this.refs vs document.getElementBy아이디 (0) | 2023.03.03 |
| Oracle SQL 이스케이프 문자('&'의 경우) (0) | 2023.03.03 |
| 배열에 존재하는 값을 기반으로 한ng-show (0) | 2023.03.03 |
