2011-11-15 54 views
3

尋找調試Azure表存儲非常令人沮喪。在我學習各種限制之前,試着用InvalidInput代碼來找到令人難以置信的DataServiceQueryException的原因很難說。Azure表存儲異常信息

經過多次瀏覽網頁後,http://blogs.msdn.com/b/partlycloudy/archive/2009/12/16/development-storage-logging.aspx的帖子展示瞭如何開啓日誌功能。這使用更多非常有用的信息填充錯誤日誌文件。將此日誌永久保留並不是一個好主意,並且每次遇到問題時檢查此文件都不是理想情況。

有很多關於使用Fiddler來查看實際的請求和響應的帖子,但我無法正常工作。我配置了連接字符串以通過Fiddler代理進行連接(我必須手動將ipv4.fiddler主機名添加到hosts文件,否則它不會解決 - Fiddler應自動執行此操作)。我可以看到部署的連接,但不能查看任何連接。我試過以管理員身份運行Fiddler,但仍然得到相同的結果。

爲什麼這麼難?我錯過了什麼嗎?是否有一個選項可以返回錯誤日誌文件中記錄的異常信息,而不是垃圾InvalidInput異常消息?任何想法爲什麼菲德勒不玩遊戲?

+2

你有沒有更新到最新的Azure工具(2011年11月:http://www.microsoft.com/windowsazure/sdk/)? - 在這個版本中,顯然異常信息得到了改進。 –

+0

謝謝!他們肯定有所改善。還有一些沒有那麼有用,但通常更好。 –

回答

5

通常情況下,如果您嘗試使用服務不支持的操作,將會收到無效輸入錯誤消息。請記住,整套LINQ操作(排序,最小值,最大值等)在服務中不可用(儘管它們可以在本地進行計算)。解決這個問題的第一步應該是查看您正在嘗試的實際操作。如果您使用的不是.Select()或.Where(),則目前不支持它。

編輯:只要我寫這個,我遇到了類似的錯誤。因爲我已經知道哪些操作的支持,我想我會告訴你我是用來排除代碼:

void Main() 
{ 
    var acct = CloudStorageAccount.DevelopmentStorageAccount; 

    var client = acct.CreateCloudTableClient(); 
    var ctx = client.GetDataServiceContext(); 
    ctx.IgnoreMissingProperties = true; 

    var table = "tl36f6e92d94954f168ade0be6a547c0ce"; 

    //build query 
    var q = ctx.CreateQuery<Foo>(table) 
     .Where(e => e.RowKey.CompareTo(2) < 0) //this query fails 
     .Take(10); 

    //Dump URI to inspect 
    ((DataServiceQuery)q).RequestUri.Dump(); 

    //dump results 
    q.Dump(); 
} 


[System.Data.Services.Common.DataServiceKey("PartitionKey", "RowKey")] 
class Foo 
{ 
    public string PartitionKey { get; set; } 
    public string RowKey { get; set; } 
    public string Whatever { get; set; } 
} 

我放棄了這個爲LINQPad(偉大的工具曾經),只是看了看URI。很明顯,我所做的比較是期待一個字符串,並將其作爲整數進行比較。我當然簡化了實際的查詢,但我的觀點就是這樣。我始終使用此工具來首先對查詢進行建模並檢查實際發生的情況。

4

如果您將「ipv4.fiddler」添加到您的主機文件,它將解析爲本地主機之前擊中Fiddler,因此它忽略代理設置,因爲它是本地地址。答案不是爲主機添加「ipv4.fiddler」。有一個解決方案,你已經遇到過,雖然DNS解析問題...

當你開始提琴手,它設置爲登錄的用戶127.0.0.1:8888的代理的WinINET。但是,Dev Fabric將IIS App Pool設置爲以NETWORK SERVICE運行,因此它不知道Fiddler中的WinINET代理配置,因此不會通過Fiddler路由HTTP請求。因此,使用Azure存儲連接字符串時,我們得到DNS解析失敗:「UseDevelopmentStorage = true; DevelopmentStorageProxyUri = http://ipv4.fiddler」

因此,嘗試從VS命令提示符下運行以下命令:

的bitsadmin/UTIL/SETIEPROXY NETWORKSERVICE MANUAL_PROXY 127.0.0。1:8888 NULL

因此,NETWORK SERVICE現在使用Fiddler作爲代理,將ipv4.fiddler解析爲localhost,並跟蹤與dev存儲模擬器之間的所有HTTP流量。

+1

這可以使用「bitsadmin/util/SETIEPROXY NETWORKSERVICE NO_PROXY」進行恢復。 –

+0

FWIW,Fiddler將WinINET代理設置爲http://127.0.0.1:8888爲登錄用戶,所以我只是將我的應用程序池設置爲從我的本地帳戶運行,並使用連接字符串通過Fiddler路由存儲流量上文提到的。 –

0

我剛剛得到了這個錯誤,並想扔我的2美分,希望保存別人幾分鐘......我有一個可空的Guid在我的POCO,迄今爲止,沒有記錄填補了價值w /什麼,所以當我打電話:

_repository.Find(f => f.PartitionKey == request.CompanyPartitionKey() && f.MyNullGuid == null); 

這個扔了同樣的錯誤,因爲直到一個實例來通過W/A不可爲空值,表存儲並沒有在所有把這個列...所以我通過我所做的任何事情都無法獲得「無效的輸入」,但是因爲Table Storage從未將我的可空列寫入,直到有記錄證明爲止。

的修復:我改變了我的空GUID來非空和改變了我的支票Guid.Empty ......唉......

0

我已經寫了一個擴展類天青StorageException提取所有有用的由Azure存儲服務(表,斑點,隊列,...)嵌入在其內部的信息

https://www.nuget.org/packages/AzureStorageExceptionParser/

用法:

嘗試

{

//使天青表存儲的請求(BLOB,表,隊列,..)

}

趕上(StorageException storageException)

{

// GetHttpStatusCode擴展方法爲您提供嵌入在StorageException中的HttpStatusCode

int? httpStatusCode = storageException.GetHttpStatusCode();

// GetFailedOperationIndex擴展方法給你失敗的操作的指數在表天青批處理操作

INT failedOperationIndex = storageException.GetFailedOperationIndex();

}