Сообщение или тип, который имеет MessageContractAttribute и другие параметры разных типов - PullRequest
11 голосов
/ 30 июня 2011

Я разрабатываю сервисы WCF, где некоторые классы имеют атрибут [MessageContract], а некоторые нет.

Когда я пытаюсь запустить службы, я получаю следующее сообщение об ошибке:

Операция ProcessOperation не может быть загружена, поскольку она имеет параметр или тип возврата типа System.ServiceModel.Channels.Message или тип, имеющий MessageContractAttribute и другие параметры различных типов. При использовании System.ServiceModel.Channels.Message или типов с MessageContractAttribute метод не должен использовать какие-либо другие типы параметров.

Означает ли это, что все службы должны иметь [MessageContract], хотя они не связаны?

Ответы [ 5 ]

13 голосов
/ 30 июня 2011

Нет, это означает, что у вас есть несколько параметров метода, и некоторые из них не являются сообщениями. Попробуйте опубликовать интерфейс к вашему сервису.

Это сообщение в блоге объясняет:

... проблема в том, что контракты сообщений не могут использоваться одновременно с другими типами параметров. В этом случае возвращаемым значением операции является строка. Возвращаемые значения - это просто еще один выходной параметр, поэтому эта операция смешивает сообщение контракта сообщения с примитивным типом параметра. Это терпит неудачу, потому что контракты сообщений дают вам контроль над макетом сообщения SOAP, предотвращая объединение системы в эти дополнительные параметры.

Важное примечание:

Кстати, сообщение об ошибке, которое вы получаете, когда пытается смешать контракты сообщений , выглядит следующим образом.

3 голосов
/ 10 апреля 2014

Это в основном означает, что конкретная операция использует комбинацию типов контрактов сообщений и типов примитивов в любой из следующих комбинаций:

MixType1: Contract type and primitive types as operation parameters
MixType2: Contract type as a parameter and primitive type as return type
MixType3: Primitive type as a parameter and Contract type as return type

Любой из перечисленных выше сценариев вызовет ошибку.

1 голос
/ 08 октября 2013

Решено!

Я не могу вернуть строку, у меня есть объект приветствия для клиента.

using System;
using System.ServiceModel;
using System.Net.Security;

namespace com.blogspot.jeanjmichel.model
{
    [MessageContract]
    public class Greeting
    {
        private String userGreeting;

        private void SetGreeting()
        {
            DateTime now = DateTime.Now;

            if (now.Hour >= 7 && now.Hour <= 11)
            {
                this.userGreeting = "Good morning";
            }
            else if (now.Hour >= 12 && now.Hour <= 17)
            {
                if (now.Hour == 12 || now.Hour == 13)
                {
                    this.userGreeting = "Good afternoon, it's lunch time!";
                }
                else
                {
                    this.userGreeting = "Good afternoon";
                }
            }
            else if (now.Hour >= 18 && now.Hour <= 20)
            {
                this.userGreeting = "Good evening";
            }
            else
            {
                this.userGreeting = "Good night";
            }
        }

        [MessageBodyMember(Order = 1, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
        public String UserGreeting
        {
            get { return this.userGreeting; }
        }

        public Greeting()
        {
            this.SetGreeting();
        }
    }
}

using System;
using System.ServiceModel;
using com.blogspot.jeanjmichel.model;

namespace com.blogspot.jeanjmichel.services.contract
{
    [ServiceContract(Namespace = "http://jeanjmichel.blogspot.com/services/v0.0.1")]
    public interface IGetGreeting
    {
        [OperationContract]
        Greeting GetGreeting(Credential credential);
    }
}

using System;
using System.ServiceModel;
using com.blogspot.jeanjmichel.services.contract;
using com.blogspot.jeanjmichel.model;

namespace com.blogspot.jeanjmichel.services
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
                     Namespace = "http://jeanjmichel.blogspot.com/services/v0.0.1")]
    public class GetGreetingService: IGetGreeting
    {
        public Greeting GetGreeting(Credential credential)
        {
            if (String.IsNullOrEmpty(credential.Token))
            {
                throw new FaultException("Inform the security phrase, and try again.");
            }
            else
            {
                if (credential.Token.Equals("mySeCuriTyP@ss"))
                {
                    Greeting g = new Greeting();
                    return g;
                }
                else
                {
                    throw new FaultException("Wrong password.");
                }
            }
        }
    }
}
0 голосов
/ 03 июля 2019

Когда вы используете объект сообщения в качестве параметра, метод должен возвращать void

0 голосов
/ 29 апреля 2014

Если у вас есть проблема со смешанными типами примитивов (таких как string) и MessageContract в качестве другого типа, то есть с одним классом в качестве возвращаемого и строковым параметром, один из способов, которым я решил это, был переход с MessageContract на DataContract.

Другой способ решить эту проблему - создать класс для хранения вашего типа примитива как свойства, чтобы и ваш возврат, и параметр могли реализовать MessageContract.

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