Как исправить '' Не удается преобразовать MWArray в запрошенный тип " - PullRequest
0 голосов
/ 02 января 2019

Я начинаю настраивать сервер 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...