2011-02-23 5 views
7

से मुलाकात नहीं हुई है जब मैं अपना आवेदन चलाता हूं तो मुझे यह अपवाद मिला। यह असली Azure ब्लोब भंडारण में भी होता है।एज़ूर ब्लॉब: "HTTP सशर्त हेडर (ओं) का उपयोग करके निर्दिष्ट शर्त"

मैं फ़िडलर साथ अनुरोध है कि इस समस्या पैदा करता पकड़ा गया है:

GET http://127.0.0.1:10000/devstoreaccount1/ebb413ed-fdb5-49f2-a5ac-74faa7e2d3bf/8844c3ec-9e4b-43ec-88b2-58eddf65fc0a/perro?timeout=90 HTTP/1.1 
x-ms-version: 2009-09-19 
User-Agent: WA-Storage/6.0.6002.18006 
x-ms-range: bytes=0-524304 
If-Match: 0x8CDA190BD304DD0 
x-ms-date: Wed, 23 Feb 2011 16:49:18 GMT 
Authorization: SharedKey devstoreaccount1:5j3IScY9UJLN3o1ICWKwVEazO4/IDJG796sdZKqHlR4= 
Host: 127.0.0.1:10000 

और यह प्रतिक्रिया है:

HTTP/1.1 412 The condition specified using HTTP conditional header(s) is not met. 
Content-Length: 252 
Content-Type: application/xml 
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 
x-ms-request-id: fbff9d15-65c8-4f21-9088-c95e4496c62c 
x-ms-version: 2009-09-19 
Date: Wed, 23 Feb 2011 16:49:18 GMT 

<?xml version="1.0" encoding="utf-8"?><Error><Code>ConditionNotMet</Code><Message>The condition specified using HTTP conditional header(s) is not met. 
RequestId:fbff9d15-65c8-4f21-9088-c95e4496c62c 
Time:2011-02-23T16:49:18.8790478Z</Message></Error> 

यह तब होता है जब मैं स्ट्रीम इस लाइन से लिया गया का उपयोग करें:

blob.OpenRead(); 

ईएजी एक पठन ऑपरेशन में क्यों दिमाग रखता है? मैं इस समस्या से कैसे बच सकता हूं?

हर बार जब मैं ब्लॉब स्टोरेज पर चीजों को करने के कई समानांतर कार्यों को लॉन्च करता हूं।

तो मैं का उपयोग करें:

blob.OpenRead(new BlobRequestOptions() { AccessCondition = AccessCondition.IfMatch("*") }); 

मुझे कोई भीतरी एक साथ इस अपवाद मिल गया (पहले यह विवरण के साथ एक WebException था), या तो एक फ़िडलर में लाइन असफल:

Microsoft.WindowsAzure.StorageClient.StorageClientException was unhandled 
    Message=The conditionals specified for this operation did not match server. 
    Source=mscorlib 
    StackTrace: 
    Server stack trace: 
     at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result() 
     at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait() 
     at Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImpl[T](Func`2 impl) 
     at Microsoft.WindowsAzure.StorageClient.BlobReadStream.Read(Byte[] buffer, Int32 offset, Int32 count) 
     at System.IO.BinaryReader.ReadBytes(Int32 count) 
     at System.Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read(__BinaryParser input) 
     at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadSerializationHeaderRecord() 
     at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() 
     at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
     at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
     ........... 

धन्यवाद अग्रिम।

उत्तर

6

बफ ... मिस्टर हल हो गया!

ठीक है, जब आप एक CloudBlob.OpenRead() करते हैं, क्लाइंट लाइब्रेरी दो आपरेशन कर रही है:

पहले, ब्लॉब ब्लॉक सूची मिलती है:

GET /devstoreaccount1/etagtest/test2.txt?comp=blocklist&blocklisttype=Committed&timeout=90 HTTP/1.1 
x-ms-version: 2009-09-19 
User-Agent: WA-Storage/6.0.6002.18006 
x-ms-date: Wed, 23 Feb 2011 22:21:01 GMT 
Authorization: SharedKey devstoreaccount1:SPOBe/IUrZJvoPXnAdD/Twnppvu37+qrUbHnaBHJY24= 
Host: 127.0.0.1:10000 

HTTP/1.1 200 OK 
Transfer-Encoding: chunked 
Content-Type: application/xml 
Last-Modified: Wed, 23 Feb 2011 22:20:33 GMT 
ETag: 0x8CDA1BF0593B660 
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 
x-ms-request-id: ecffddf2-137f-403c-9595-c8fc2847c9d0 
x-ms-version: 2009-09-19 
x-ms-blob-content-length: 4 
Date: Wed, 23 Feb 2011 22:21:02 GMT 

जवाब में ETag पर ध्यान।

दूसरा, मुझे लगता है कि है कि शुरू अनुरोध में ETag पर ध्यान इसे पुनः प्राप्त करने, और अब:

GET /devstoreaccount1/etagtest/test2.txt?timeout=90 HTTP/1.1 
x-ms-version: 2009-09-19 
User-Agent: WA-Storage/6.0.6002.18006 
x-ms-range: bytes=0-525311 
If-Match: 0x8CDA1BF0593B660 
x-ms-date: Wed, 23 Feb 2011 22:21:02 GMT 
Authorization: SharedKey devstoreaccount1:WXzXRv5e9+p0SzlHUAd7iv7jRHXvf+27t9tO4nrhY5Q= 
Host: 127.0.0.1:10000 

HTTP/1.1 206 Partial Content 
Content-Length: 4 
Content-Type: text/plain 
Content-Range: bytes 0-3/4 
Last-Modified: Wed, 23 Feb 2011 22:20:33 GMT 
ETag: 0x8CDA1BF0593B660 
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 
x-ms-request-id: db1e221d-fc61-4837-a255-28b1547cb5d7 
x-ms-version: 2009-09-19 
x-ms-lease-status: unlocked 
x-ms-blob-type: BlockBlob 
Date: Wed, 23 Feb 2011 22:21:02 GMT 

अगर एक और WebRole कॉल के बीच ब्लॉब में कुछ करना क्या होता है? हाँ एक दौड़ की स्थिति

समाधान:

GET /devstoreaccount1/etagtestxx/test2.txt?timeout=90 HTTP/1.1 
x-ms-version: 2009-09-19 
User-Agent: WA-Storage/6.0.6002.18006 
x-ms-date: Wed, 23 Feb 2011 22:34:02 GMT 
Authorization: SharedKey devstoreaccount1:VjXIO2kbjCIP4UeiXPtxDxmFLeoYAKOqiRv4SV3bZno= 
Host: 127.0.0.1:10000 

HTTP/1.1 200 OK 
Content-Length: 4 
Content-Type: text/plain 
Last-Modified: Wed, 23 Feb 2011 22:33:47 GMT 
ETag: 0x8CDA1C0DEB562D0 
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 
x-ms-request-id: 183a05bb-ea47-4811-8768-6a62195cdb64 
x-ms-version: 2009-09-19 
x-ms-lease-status: unlocked 
x-ms-blob-type: BlockBlob 
Date: Wed, 23 Feb 2011 22:34:02 GMT 

मैं काम पर कल सुबह अभ्यास पर इस डाल दिया और क्या हो देखेंगे: उपयोग CloudBlob.DownloadToStream(), कि विधि केवल एक कॉल जारी करता है।

+0

क्लाउडब्लोब का उपयोग करें। डाउनलोड टोस्ट्रीम ने चाल की है :) – vtortola

+0

आपको एमएस को सूचित करना चाहिए कि उनका सर्वर अमान्य ईटैग भेज रहा है, और जब ग्राहक ने इसके लिए नहीं पूछा तो उन्हें आंशिक प्रतिक्रिया (206) वापस नहीं करनी चाहिए। –

+0

मैंने इसे एमएसडीएन मंचों में रखा है, लेकिन कोई जवाब नहीं देता है। – vtortola

1

एक बात जो मन में आता है कि

If-Match: 0x8CDA190BD304DD0 

में ETag विकृत है है; एक वैध (मजबूत) etag हमेशा डबल उद्धरण में है।

डुनो कि क्या आपकी समस्या के साथ कुछ करने के लिए कुछ है या नहीं।

+0

असल में मैंने कहीं पढ़ा है कि जब ETag अवैध स्वरूप है कि HTTP 412 लौटाया जाता है। मुझे नहीं पता कि वह ईएजी कहां से आता है। – vtortola

+0

यहां: http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/386afc5e-9bd3-490b-98d7-22fd03bda3a9/ – vtortola

+0

+1 विनिर्देश अनुपालन के उल्लेख के लिए। – Gumbo

1

तुम अब भी OpenRead उपयोग कर सकते हैं, तो आप नीचे दिए गए कोड की तरह उदाहरण OperationContext पारित करने के लिए की जरूरत है:

// cloudBlob instance of CloudPageBlob 

OperationContext context = new OperationContext(); 
context.SendingRequest += (sender, e) => { 
    e.Request.Headers["if-match"] = "*"; 
}; 

using (AutoResetEvent waitHandle = new AutoResetEvent(false)) 
{ 
    cloudBlob.StreamMinimumReadSizeInBytes = 16385; 
    var result = cloudBlob.BeginOpenRead(null, null, context, 
     ar => waitHandle.Set(), 
     null); 
    waitHandle.WaitOne(); 
    using (Stream blobStream = vhd.EndOpenRead(result)) 
    { 
     var k = blobStream.ReadByte(); 
    } 
} 
संबंधित मुद्दे