2016-11-08 4 views
0

Ich versuche, DocumentDB Unterstützung zu einer bestehenden App in Dotnetcore hinzugefügt, so dass ich nicht das SDK verwenden kann, aber dachte, ich würde nur die REST-API verwenden. Einfach genug und die Proben waren einfach zu duplizieren. Ich kann alle Listen/Abfragen, die im REST-API-Beispiel enthalten sind, problemlos ausführen.documentDB Rest API - Dokument erstellen

Das Problem kommt, wenn Sie versuchen, Dokumente zu erstellen. Ich bin ständig mit einem 401 konfrontiert und kann es nicht umgehen. Ich benutze den Primärschlüssel - nicht den Nur-Lese-Schlüssel. Und ich habe das API-Dokument hier gelesen und gelesen: https://msdn.microsoft.com/en-us/library/azure/mt489088.aspx, kann es aber nicht ganz machen.

Es ist wahrscheinlich mit meinem Auth-Schlüssel, aber ich verwende die Methode in den Beispielen GenerateMasterKeyAuthorizationSignature(string verb, string resourceId, string resourceType, string key, string keyType, string tokenVersion) und das funktioniert gut für die Abfragen. Ich verwende ID basierte resourceId und dachte, dass ich aus der Zeit vor dem Code wiederverwenden könnte:

resourceLink = string.Format("dbs/{0}/colls/{1}/docs", databaseId, collectionId); 
resourceId = (idBased) ? string.Format("dbs/{0}/colls/{1}/docs", databaseId, collectionId) : collectionId.ToLowerInvariant();` 

Der Zeitstempel scheint richtig, weil die Abfragen arbeiten, obwohl ich das Problem an anderer Stelle erwähnt gesehen habe. Und ich bin mit Ryans PostWithNoCharSetAsync

Ich habe versucht, mit und ohne client.DefaultRequestHeaders.Add("x-ms-documentdb-is-upsert", "true");

Könnte es etwas mit Partitionen sein? Sollte ich das spezifizieren?

Die API-Dokumente haben Header wie Cookies und No-Cache. Die machen keinen Unterschied, oder?

Spielt es eine Rolle, ob die JSON-Dokument über mit Stringliteral Markierungen kommt - wie folgt aus: " {\r\n \"id\": 4441,\r\n \"Name\": \"Artesia Spa - Grand Hotel\",\r\n }

Unterhalb der POST von Fiedler ist.

REQUEST

POST https://etest.documents.azure.com/dbs/etest/colls/unittest/docs HTTP/1.1 
x-ms-date: Tue, 08 Nov 2016 20:34:40 GMT 
x-ms-version: 2015-12-16 
authorization: type%3dmaster%26ver%3d1.0%26sig%3dU8BmnPhUMWyoVqNdbI0hy1Kc%2b1Yge79dCBMz8f2v9pE%3d 
x-ms-documentdb-is-upsert: true 
Content-Type: application/query+json 
Host: etest.documents.azure.com 
Content-Length: 48 
Expect: 100-continue 

{"id": 4441,"Name": "Artesia Spa - Grand Hotel"} 

RESPONSE

HTTP/1.1 401 Unauthorized 
Content-Type: application/json 
Server: Microsoft-HTTPAPI/2.0 
x-ms-activity-id: d83ae44f-3dc8-47a6-b310-cdf8ca87c597 
Strict-Transport-Security: max-age=31536000 
x-ms-gatewayversion: version=1.10.39.1 
Date: Tue, 08 Nov 2016 20:36:11 GMT 
Content-Length: 358 

{"code":"Unauthorized","message":"The input authorization token can't serve the request. Please check that the expected payload is built as per the protocol, and check the key being used. Server used the following payload to sign: 'post\ndocs\ndbs/etest/colls/unittest\ntue, 08 nov 2016 20:34:40 gmt\n\n'\r\nActivityId: d83ae44f-3dc8-47a6-b310-cdf8ca87c597"} 
+0

hi, stört es Ihnen Ihren Code für GenerateMasterKeyAuthorizationSignature zu veröffentlichen? Es wäre einfacher, mit Code zu beheben. Bitte beachten Sie, dass die Ressourcen-ID, wenn Sie die Ressourcen-ID zum Erstellen des Tokens verwenden, die mit der Ressource übereinstimmende Hülle verwalten muss, z. Meine Sammlung. Hier ist ein Verweis auf Auth Token-Zeichenfolge mit der REST-API zu konstruieren: https://msdn.microsoft.com/en-us/library/azure/dn783368.aspx A – h0n

+0

Auch können Sie bitte einen Blick und vergleichen Sie Ihre Implementierung mit https : //github.com/Azure/azure-documentdb-dotnet/blob/master/samples/rest-from-.net/Program.cs? –

Antwort

1

Es ist jetzt ein offizieller .Net-Core SDK Sie erhalten und verwenden können, genau wie die vorherige SDK, from Nuget.

Wenn Sie eine vollständige Probe benötigen, können Sie einen Blick auf eine GitHub repo ich veröffentlicht, die die häufigsten Szenarien deckt.

Verwandte Themen