programing

Azure 테이블 저장소에서 400 Bad Request가 반환됨

iphone6s 2023. 3. 3. 17:07
반응형

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' 오류가 발생하였습니다.

키 필드에 허용되지 않는 문자

PartitionKeyRowKey 속성 값에는 다음 문자를 사용할 수 없습니다.

  • 슬래시(/) 문자
  • 백슬래시(\) 문자
  • 숫자 기호(#) 문자
  • 물음표(?) 문자
  • 다음을 포함하여 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에 적절한 값을 제공하고 있는 경우는, 이러한 문제에 직면할 가능성이 있습니다.

케이스를 고쳤더니 잘 됐어요

내 경우:

  1. 행 키의 형식이 잘못되었습니다(400).
  2. 파티션 키와 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 이하입니다."

https://learn.microsoft.com/en-us/rest/api/storageservices/understanding-the-table-service-data-model

저는 테이블 이름에 대시 예를 사용하여 tablename: "table-1234"를 사용했지만, tablename: "table1234"는 대시 기능을 하지 않았습니다.

저는 "#" 문자가 포함된 PartitionKey/RowKey를 사용하여 Azure 스토리지 테이블에 엔티티를 삽입하려고 했습니다.싱글 테이블 설계에서 구분 기호로 "#"을 사용하는 것이 일반적이기 때문에 이 방법은 허용되지 않습니다.

언급URL : https://stackoverflow.com/questions/14859405/azure-table-storage-returns-400-bad-request

반응형