首页 > 解决方案 > 如何使用 .net Sdk 版本 3 使用自定义序列化调用 CosmosDb 上的存储过程?

问题描述

我想要做的是使用 cosmos .net Sdk 版本 3 调用具有特定 Json 序列化配置的 SP。

使用版本 2,我可以在调用中设置 RequestOptions JsonSerializerSettings 属性。

现在有了版本 3,我没有那个选项,我唯一拥有的就是在客户端对象级别设置自定义配置。

这是唯一可用的选项吗?我必须为我需要的每个配置创建一个新客户端?

提前致谢

标签: azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


你可以打电话ExecuteStoredProcedureStreamAsync。参考:https ://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos/src/Resource/Scripts/Scripts.cs#L434

它的签名是:

public abstract Task<ResponseMessage> ExecuteStoredProcedureStreamAsync(
    string storedProcedureId,
    PartitionKey partitionKey,
    dynamic[] parameters,
    StoredProcedureRequestOptions requestOptions = null,
    CancellationToken cancellationToken = default(CancellationToken));

这意味着它会给你一个ResponseMessage支持,你可以用一个Content(Stream) 反序列化你想要的任何东西。

如果你想序列化输入,还有另一种方法:

 public abstract Task<ResponseMessage> ExecuteStoredProcedureStreamAsync(
            string storedProcedureId,
            Stream streamPayload,
            PartitionKey partitionKey,
            StoredProcedureRequestOptions requestOptions = null,
            CancellationToken cancellationToken = default(CancellationToken));

哪里streamPayloadStream. 示例用法:https ://github.com/Azure/azure-cosmos-dotnet-v3/blob/fad3daf789458bc73256d4b26bdd1e4cfc83b2ad/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/StoredProcedureTests.cs#L474

MemoryStream streamPayload = new MemoryStream(Encoding.UTF8.GetBytes(@"[""one"",""two"",""three""]"));

ResponseMessage response = await this.scripts.ExecuteStoredProcedureStreamAsync(
    storedProcedureId: sprocId,
    streamPayload: streamPayload,
    partitionKey: new Cosmos.PartitionKey(testPartitionId),
    requestOptions: null,
    cancellationToken: default(CancellationToken));

推荐阅读