添加[MessageContract]属性后,为什么会出现InvalidOperationException?

时间:2013-01-17 13:28:43

标签: wcf soap hl7 contract

The operation 'PRPA_IN201301UV02' could not be loaded because it has a parameter or return type of type System.ServiceModel.Channels.Message or a type that has MessageContractAttribute and other parameters of different types. When using System.ServiceModel.Channels.Message or types with MessageContractAttribute, the method must not use any other types of parameters.

我在控制台主机上运行WCF,这是合同:

[MessageContract]
public class opRequest
{
    [MessageBodyMember]
    public string myProperty;
}

[ServiceContract(Namespace = "urn:hl7-org:v3")]
public interface IHL7v3
{
    [OperationContract(Name = "PRPA_IN201301UV02", Action = "urn:hl7-org:v3:PRPA_IN201301UV02")]
    string PIXManager_PRPA_IN201301UV02(opRequest clientID);
}

当我从opRequest类中删除[MessageContract][MessageBodyMember]

时,它会运行

我完全不确定这是否能让我得到我需要的东西,所以我会给更广泛的范围 - 我试图让SOAP主体没有参数名称的封闭标签。 例如(SOAP消息中的正文提取)而不是:

<s:Body>
<PRPA_IN201301UV02 xmlns="urn:hl7-org:v3">
  <clientID>the xml document is enclosed</clientID>
</PRPA_IN201301UV02>

我希望它是这样的:

<s:Body>
<PRPA_IN201301UV02 xmlns="urn:hl7-org:v3">
  my given xml document will go here...
</PRPA_IN201301UV02>

我需要它符合标准(HL7v3 PIX Manager SOAP Web服务)。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

看起来你应该使用MessageContract作为返回参数

<强>编辑: 有关详细信息,请查看此MSDN文章Using Message Contracts 如果您使用消息设计合同,则不能将其他类型用作参数或返回值。

以下是文章中的代码段:

[OperationContract]
bool Validate(BankingTransaction bt);
// Invalid, the return type is not a message contract.
[OperationContract]
void Reconcile(BankingTransaction bt1, BankingTransaction bt2);
// Invalid, there is more than one parameter.

答案 1 :(得分:0)

您是否尝试使用XMLDocument作为输入参数而不是opRequest?您还必须标记接口以使用XML Serializer:

[ServiceContract(Namespace = "urn:hl7-org:v3")]
[XmlSerializerFormat]
public interface IHL7v3
{
    [OperationContract(Name = "PRPA_IN201301UV02", Action = "urn:hl7-org:v3:PRPA_IN201301UV02")]
    XMLDocument PIXManager_PRPA_IN201301UV02(XMLDocument doc);
}

我假设您也在返回XML。

请注意,这是全开 - 可以发送任何XML,这可能不是您想要的,因为没有明确的数据合同。