消息或具有MessageContractAttribute的类型以及不同类型的其他参数

时间:2011-06-30 05:04:23

标签: wcf

我正在开发WCF服务,其中某些类具有[MessageContract]属性,而有些类则没有。{1}}属性。

当我尝试运行服务时,我收到以下错误消息:

  

无法加载“ProcessOperation”操作,因为它具有System.ServiceModel.Channels.Message类型的参数或返回类型,或者具有MessageContractAttribute的类型和不同类型的其他参数。使用System.ServiceModel.Channels.Message或使用MessageContractAttribute类型时,该方法不得使用任何其他类型的参数。

这是否意味着所有服务必须具有[MessageContract],尽管它们不相关?

5 个答案:

答案 0 :(得分:13)

不,这意味着您在方法上有多个参数,其中一些不是消息。尝试将界面发布到您的服务。

blog post解释了:

  

...问题是消息合同不能与其他参数类型同时使用。在这种情况下,操作的返回值是一个字符串。返回值只是另一个输出参数,因此此操作将消息协定消息与基本参数类型混合。这会失败,因为消息契约使您可以控制SOAP消息的布局,从而防止系统在这些附加参数中进行融合。

重要提示:

  

顺便说一下,尝试混合邮件合同时收到的错误消息如下所示。

答案 1 :(得分:3)

这基本上意味着特定操作在以下任何组合中使用消息协定类型和基本类型的组合:

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

上面列出的任何一种情况都会产生错误。

答案 2 :(得分:1)

解决!

我无法返回String,我已将Greeting对象返回给客户端。

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.");
                }
            }
        }
    }
}

答案 3 :(得分:0)

如果您遇到混合类型的原语(如string)和MessageContract作为另一种类型的问题,即一个类作为return和一个字符串参数,我解决这个问题的一种方法是从MessageContract切换到DataContract。

另一种解决方法是创建一个类来保存基本类型作为属性,这样返回和参数都可以实现MessageContract。

答案 4 :(得分:0)

使用Message对象作为参数时,该方法应返回void