C# Azure存储表返回异常400错误请求
我正在尝试创建azure存储表,并使用c#将记录插入其中。 我已经成功地创建了表,但在向表中插入记录时,它给了我400个错误请求存储异常 签入调试器后: StorageException.RequestInformation.ExtendedErrorInformation.ErrorMessage 它显示OutofRange输入错误 “一个请求输入超出范围。\n请求ID:862fdbae-6002-000c-1e7c-ef9373000000\n时间:2019-04-10T09:06:05.9840359Z” 我借助这根线 及C# Azure存储表返回异常400错误请求,c#,azure,exception,azure-storage,azure-table-storage,C#,Azure,Exception,Azure Storage,Azure Table Storage,我正在尝试创建azure存储表,并使用c#将记录插入其中。 我已经成功地创建了表,但在向表中插入记录时,它给了我400个错误请求存储异常 签入调试器后: StorageException.RequestInformation.ExtendedErrorInformation.ErrorMessage 它显示OutofRange输入错误 “一个请求输入超出范围。\n请求ID:862fdbae-6002-000c-1e7c-ef9373000000\n时间:2019-04-10T09:06:05.9
- 尝试将null传递到实体模型变量中,以查看是否有任何记录超出范围
- 已尝试通过RowKey中的“测试”
- 已尝试通过PartitionKey中的“1”/“测试”
- 已尝试在RowKey中传递Guid.NewGuid().ToString()或ToAzureKeyString(Guid.NewGuid().ToString())
- 尝试传递DateTimeOffset。现在在时间戳中
public void GetGPSFileData(Config objConfig, TraceWriter log)
{
try
{
BindData objData = new BindData();
string date = DateTime.Now.Date.ToString("ddMMyyyy");
string storageTable = "TABLE" + date + objData.REPCODE;
TableStorage tableStorage = new TableStorage(objData);
CreateTableStorage(objConfig, storageTable, tableStorage, log);
}
catch (StorageException ex)
{
log.Info($"Storage Exception while reading GPS File Data from Azure Storage: " + ex.RequestInformation.ExtendedErrorInformation.ErrorMessage + DateTime.Now);
throw ex;
}
catch (Exception ex)
{
log.Info($"Error while reading GPS File Data from Azure Storage: " + ex.Message + DateTime.Now);
throw ex;
}
}
表存储.cs
public class TableStorage: TableEntity
{
public string CLIENTID { get; set; }
public string REPCODE { get; set; }
public int ENTRYNO { get; set; }
public string DEVICEID { get; set; }
public double LAT { get; set; }
public double LNG { get; set; }
public DateTime DATE_TIME { get; set; }
public string PCODE { get; set; }
public string PNAME { get; set; }
public DateTime TXNDATE { get; set; }
public TableStorage(BindData objData)
{
PartitionKey = objData.CLIENTID;
RowKey = ToAzureKeyString(Guid.NewGuid().ToString());
Timestamp = DateTimeOffset.Now;
CLIENTID = objData.CLIENTID;
REPCODE = objData.REPCODE;
ENTRYNO = objData.ENTRYNO;
DEVICEID = objData.DEVICEID;
LAT = objData.LAT;
LNG = objData.LNG;
DATE_TIME = objData.DATE_TIME;
PCODE = objData.PCODE;
PNAME = objData.PNAME;
TXNDATE = objData.TXNDATE;
}
public string ToAzureKeyString(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();
}
}
创建并插入存储表代码:
public void CreateTableStorage(Config objConfig, string tableName, TableStorage tableStorage, TraceWriter log)
{
try
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(objConfig.TABLE_STORAGE_CONN_STRING);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(tableName);
table.CreateIfNotExists();
TableOperation insert = TableOperation.Insert(tableStorage);
table.Execute(insert);
}
catch(StorageException ex)
{
log.Info($"Storage Exception while inserting record into Table Storage: " + ex.RequestInformation.ExtendedErrorInformation.ErrorMessage + DateTime.Now);
throw ex;
}
catch(Exception ex)
{
log.Info($"Error while inserting record into Table Storage: " + ex.Message + DateTime.Now);
throw ex;
}
}
TableStorage类的对象包含:
问题是什么?我是全新的azure存储表。
请帮忙。
提前感谢。我认为继承TableEntity的类可能缺少默认/无参数构造函数。从表存储接收对象时,非常需要无参数构造函数来反序列化对象 请务必参考 可能更正的代码:
public class TableStorage: TableEntity
{
public string CLIENTID { get; set; }
public string REPCODE { get; set; }
public int ENTRYNO { get; set; }
public string DEVICEID { get; set; }
public double LAT { get; set; }
public double LNG { get; set; }
public DateTime DATE_TIME { get; set; }
public string PCODE { get; set; }
public string PNAME { get; set; }
public DateTime TXNDATE { get; set; }
public TableStorage(){}//Added default constructor
public TableStorage(BindData objData)
{
PartitionKey = objData.CLIENTID;
RowKey = ToAzureKeyString(Guid.NewGuid().ToString());
Timestamp = DateTimeOffset.Now;
CLIENTID = objData.CLIENTID;
REPCODE = objData.REPCODE;
ENTRYNO = objData.ENTRYNO;
DEVICEID = objData.DEVICEID;
LAT = objData.LAT;
LNG = objData.LNG;
DATE_TIME = objData.DATE_TIME;
PCODE = objData.PCODE;
PNAME = objData.PNAME;
TXNDATE = objData.TXNDATE;
}
public string ToAzureKeyString(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();
}
}
问题是由于
TXNDATE
属性的值引起的。如果查看您共享的图片,您发送的值是1/1/01
(即DateTime.MinValue
),而允许的最小值是1/1/1601
一旦你为
txndae
传递了正确的值,你就不会看到这个错误。当你尝试插入时,字符串中有“/”这样的字符吗?@IvanYang没有,我在插入之前检查了每个值,甚至尝试传递空字符串或空字符串谢谢,我尝试将日期传递到txndae,它成功了。我在txndae中传递了1/1/01,在将适当的日期输入TXNDATE后,它成功地工作了。即使我没有在表存储中创建无参数构造函数,它也可以工作,我真的需要创建无参数构造函数吗?我想是的,您需要它,因为没有它,读取操作将无法工作。因此,目前我认为您没有从存储器中读取任何数据,但在执行此操作时,您将需要无参数构造函数。是的,读取数据时它给了我一个错误。希望这样做也能解决您的读取问题:)是的,它解决了。谢谢:)