主要内容

本页采用了机器翻译。点击此处可查看英文原文。

在 .NET 客户端中使用协议缓冲区同步 RESTful 请求

此示例展示如何使用 .NET 客户端 API、MATLAB® Production Server™ 用于 MATLAB 函数执行的 RESTful API 和协议缓冲区 (protobuf) 发出同步 RESTful 请求。该示例提供并解释了一个示例 C# 客户端 MagicSync.cs,用于评估部署在服务器上的 MATLAB 函数。

要在向服务器发出请求时使用 protobuf,请在客户端代码中将 HTTP Content-Type 请求标头设置为 application/x-google-protobuf。.NET 客户端库中的 MathWorks.MATLAB.ProductionServer.Client.REST 命名空间提供了辅助类,用于内部根据 proto 格式创建 protobuf 消息并返回相应的字节数组。在 HTTP 请求正文中使用此字节数组。.NET 客户端库提供了反序列化 protobuf 响应的方法和类。

在同步请求执行中,客户端发出请求后,服务器模块所有进一步的请求,直到完成对原始请求的处理为止。处理完成后,服务器自动向客户端返回响应。有关详细信息,请参阅同步执行

要使用 .NET 客户端 API,您必须在 C#工程中添加对 MathWorks.MATLAB.ProductionServer.Client.dll 文件的引用。有关为您的工程准备 Microsoft® Visual Studio® 环境的更多信息,请参阅准备您的 Microsoft Visual Studio 环境

在本地 MATLAB Production Server 安装中,客户端 API 位于 $MPS_INSTALL/client,其中 $MPS_INSTALLMATLAB Production Server 的安装位置。客户端 API 也可从 MATLAB Production Server 客户端库下载。Java® 客户端 API 也托管在 https://mvnrepository.com/artifact/com.mathworks.prodserver/mps_java_client 的 Maven™ 存储库中。

MATLAB 函数部署到服务器

编写一个使用 magic (MATLAB) 函数创建幻方的 MATLAB 函数 mymagic,然后将其部署在服务器上。函数 mymagic 接受单个 int32 输入并以二维 double 数组的形式返回一个幻方。该示例假定服务器实例在 http://localhost:9910 上运行。

有关如何部署的信息,请参阅针对 MATLAB Production Server 创建可部署存档

function m = mymagic(in)

  m = magic(in);
end

向服务器发出同步请求

在 C# 客户端代码中,使用 POST Synchronous Request 向服务器发出初始请求。有关 MATLAB Production Server 中同步请求执行的更多信息,请参阅同步执行

  1. 创建请求。

    使用 .NET WebRequest.Create 方法向 POST 同步请求 RESTful API 创建请求。

    请求 URL 包括服务器实例的地址(http://localhost:9910)、部署的存档的名称(mymagic)和要评估的 MATLAB 函数的名称(mymagic)。将 HTTP 请求方法设置为 POST。将 HTTP Content-Type 请求标头设置为 application/x-google-protobuf,因为 API 返回协议缓冲区消息的字节数组。

    String mpsBaseUrl = "http://localhost:9910";
    var firstRequest = (HttpWebRequest)WebRequest.Create(mpsBaseUrl + "/mymagic/mymagic");
    firstRequest.Method = "POST";
    firstRequest.ContentType = "application/x-google-protobuf";

  2. 将请求发送到服务器。

    使用 .NET WebRequest.getResponse 方法将请求发送到服务器。

    使用 MATLAB Production Server .NET 客户端 API 的 Create(arg1, arg2, arg3) 命名空间中的 MATLABParams 类中定义的 MathWorks.MATLAB.ProductionServer.Client.REST 方法来构建协议缓冲区消息。Create 方法将部署函数的预期输出参量数量、预期输出类型以及表示部署函数输入的对象数组作为输入。由于部署的 mymagic 函数返回单个二维数组,因此将 arg1 设置为 1,将 arg2 设置为 new List<Type> { typeof(double[,]) }。为 arg3 指定一个整数值,它是 mymagic 函数的输入。

    MATLABParams mlParams = MATLABParams.Create(1, new List<Type> { typeof(double[,]) }, 2);
    mlParams.WriteTo(firstRequest.GetRequestStream());
    var response = (HttpWebResponse)firstRequest.GetResponse();

有关 WebRequest 类的更多信息,请参阅 Microsoft 文档

接收并解释服务器响应

成功执行 POST 同步请求后,服务器将以协议缓冲区消息进行响应。使用 MATLABResult 类的方法解析协议缓冲区消息以获取请求的结果。要创建 MATLABResult 对象,请使用 Create 方法。将 MATLABParams mlParams 对象和 POST 同步请求的响应体传递给 Create 方法。

如果部署的 MATLAB 函数执行时出现错误,则对 Result 方法的调用将抛出包含来自 MATLAB 的错误消息的 MATLABException

MATLABResult mlResult;
mlResult = MATLABResult.Create(mlParams, response.GetResponseStream());
try
{
    double[,] result = mlResult.Result<double[,]>();
    Console.WriteLine("Printing the 2-D array...\n");
    PrintMagic(result);
}
catch (MATLABException e)
{
    Console.WriteLine(e.ToString());
}

该示例使用辅助方法 PrintMagic,该方法将 POST 同步请求的响应主体作为输入,并打印相应的二维幻方数组。

static void PrintMagic(double[,] magic)
{
    int numDims = magic.Rank;
    int[] dims = new int[numDims];

    for (int i = 0; i < numDims; i++)
    {
        dims[i] = magic.GetLength(i);
    }
    
    for (int j = 0; j < dims[0]; j++)
    {    
        for (int k = 0; k < dims[1]; k++)
        {
            Console.Write(magic[j, k]);
            if (k < dims[1] - 1)
            {
                Console.Write(",");
            }
        }
        Console.WriteLine();
    }
}

运行 C# 应用程序将生成以下输出。

Printing the 2-D array...

1,3
4,2

以下是 MagicSync.cs C# 客户端的示例代码。

代码:

 MagicSync.cs

另请参阅

主题