Я начинаю настраивать сервер WCF для приложения Matlab и хотел бы получить структуру обратно с помощью тестового клиента Microsoft WCF. Мне нужна помощь в успешной передаче структуры Matlab.
Я следую инструкциям, предоставленным MATHWORKS:
https://www.mathworks.com/help/compiler_sdk/dotnet/create-windows-communications-foundation-based-components.html#bsuwtjv
Я использую Windows 10, VS 2017, Community Edition. Для Matlab я использую:
<MathWorks_version_info>
<version>9.5.0.944444</version>
<release>R2018b</release>
<description></description>
<date>Aug 28 2018</date>
<checksum>1708982227</checksum>
Мне удалось успешно общаться через WCF с помощью простого строкового ответа. Я могу передать данные в Matlab и сгенерировать простой график. Однако, когда я пытаюсь использовать возврат Matlab через структуру, я не могу обойти ошибку, описанную ниже.
Функция Matlab:
function y = callMATLABfunction( x )
clearvars -except x; close all;
if nargin == 1 && ~isempty(x)
if isnumeric(x)
[...]
y.Completion = 1;
y.Result = 'FirstCompletion';
y.Message = 'Success';
else
[...]
y.Completion = 1;
y.Result = 'SecondCompletion';
y.Message = 'Success';
end
else
y.Completion = 0;
y.Result = 'Error';
y.Message = 'Please supply one input variable';
end
end
IMatlabInterface.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using System.Text;
using System.Threading.Tasks;
namespace MatlabSvc
{
[ServiceContract]
public interface IMatlabInterface
{
[OperationContract(Name = "callMATLABfunction_1")]
y callMATLABfunction(System.Double x);
[OperationContract(Name = "callMATLABfunction_2")]
y callMATLABfunction(System.String x);
}
[KnownType(typeof(y))]
[DataContract]
public class y
{
[DataMember]
public double Completion { get; set; }
[DataMember]
public string Result { get; set; }
[DataMember]
public string Message { get; set; }
}
}
Я ожидал увидеть структуру возврата в тестовом клиенте Microsoft WCF. Вместо этого я получаю:
Невозможно преобразовать MWArray в запрошенный тип
Трассировка стека серверов:
в System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood (ответ на сообщение, ошибка MessageFault, действие String, версия MessageVersion, FaultConverter faultConverter)
в System.ServiceModel.Channels.ServiceChannel.HandleReply (операция ProxyOperationRuntime, ProxyRpc & rpc)
в System.ServiceModel.Channels.ServiceChannel.Call (строковое действие, логический односторонний режим, операция ProxyOperationRuntime, Object [] ins, Object [] outs, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (метод IMethodCallMessageCall, операция ProxyOperationRuntime)
в System.ServiceModel.Channels.ServiceChannelProxy.Invoke (сообщение IMessage)
Исключение переброшено в [0]:
в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg)
в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, тип Int32)
в IMatlabInterface.callMATLABfunction_1 (Double x)
at MatlabInterfaceClient.callMATLABfunction_1 (Double x)