Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF:将值类型参数传递给返回消息协定的操作_C#_Wcf_Soap_Value Type_Messagecontract - Fatal编程技术网

C# WCF:将值类型参数传递给返回消息协定的操作

C# WCF:将值类型参数传递给返回消息协定的操作,c#,wcf,soap,value-type,messagecontract,C#,Wcf,Soap,Value Type,Messagecontract,情况: 我有这份服务合同: [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] public interface IMyServiceContract { //This WORKS! Because GUIDWRAPPER and Group have a MessageContract [OperationContract] Group GetA(GUIDWRAPPER id);

情况:

我有这份服务合同:

[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IMyServiceContract
{
    //This WORKS! Because GUIDWRAPPER and Group have a MessageContract
    [OperationContract]
    Group GetA(GUIDWRAPPER id);

    //This DOES NOT WORK, because int has no MessageContract!
    [OperationContract]
    Group GetB(int id);
}
[MessageContract]
public class GUIDWRAPPER
{
    public GUIDWRAPPER() { }

    public GUIDWRAPPER(Guid id)
    {
        Id = id;
    }

    [MessageBodyMember]
    public Guid Id { get; set; }
}
在这种情况下,组有一个消息约定,此消息约定从服务约定继承安全级别。组看起来像这样:

[MessageContract]
public class Group: Entity, ICloneable
{
    public Group(){}

    [MessageBodyMember]
    public String Name {get;set;}
}
GUIDWRAPPER类型是一个简单的包装器für a Guid,它还有一个消息约定:

[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IMyServiceContract
{
    //This WORKS! Because GUIDWRAPPER and Group have a MessageContract
    [OperationContract]
    Group GetA(GUIDWRAPPER id);

    //This DOES NOT WORK, because int has no MessageContract!
    [OperationContract]
    Group GetB(int id);
}
[MessageContract]
public class GUIDWRAPPER
{
    public GUIDWRAPPER() { }

    public GUIDWRAPPER(Guid id)
    {
        Id = id;
    }

    [MessageBodyMember]
    public Guid Id { get; set; }
}
问题:

当我启动服务主机时,它会抱怨操作“GetB”无效,因为返回类型“Group”有消息约定,而值类型“int”没有。这可能是一个安全漏洞

“GetA”没有问题,因为返回类型和参数类型都有消息约定

可能的解决方案:

1.)我可以像包装GUIDWRAPPER类一样包装所有的值类型,并给它们一个消息约定。但我觉得那又脏又臭

2.)删除所有消息契约,只需使用数据契约即可。然后我失去了控制,发送和接收数据

我的问题:

是否可以将简单的值类型(如本例中的int)传递给具有消息约定返回类型的服务操作?(如本例中的GetB)


运营合同是否有任何属性允许这样做?

Hmm为什么除了
[MessageBodyMember
之外还有
[DataMember]
?请忽略[DataMember]现在,因为这都是关于消息约定的问题。谢谢。@MickyD是的,正如您从我的示例代码中看到的,我已经知道了。类GUID是GUID的包装器,并且有一个消息约定。正如我在讨论中所写的,它是有效的。我唯一简单的问题是,是否可以传递一个简单的值类型而不是任何消息合同。在我写这个问题之前,我读过这篇文章,但我找不到答案。哦,我没有看到
GUID
我的不好。也许可以称之为
GuidWrapper
,或者更好的做法是在
GetARequest
中用请求作为后缀,这是惯例。你是否开始使用
MessageContract
?如果不使用
DataContract
。否则您需要仔细研究为什么除了
[MessageBodyMember
之外还有
[DataMember]
?请忽略[DataMember]现在,因为这都是关于消息约定的问题。谢谢。@MickyD是的,正如您从我的示例代码中看到的,我已经知道了。类GUID是GUID的包装器,并且有一个消息约定。正如我在讨论中所写的,它是有效的。我唯一简单的问题是,是否可以传递一个简单的值类型而不是任何消息合同。在我写这个问题之前,我读过这篇文章,但我找不到答案。哦,我没有看到
GUID
我的不好。也许可以称之为
GuidWrapper
,或者更好的做法是在
GetARequest
中用请求作为后缀,这是惯例。你是否开始使用
MessageContract
?如果不使用
DataContract
。否则您需要尽职尽责