未正确生成WCF代理

未正确生成WCF代理,wcf,wsdl,svcutil.exe,Wcf,Wsdl,Svcutil.exe,我有一个WCF服务,需要从数据库返回一个文件。为此,我创建了两个MessageContract类,一个用于输入,一个用于输出。代码如下: [MessageContract] public class AttachmentFile { [MessageHeader(MustUnderstand = true)] public Int32 AttachmentID; [MessageHeader] public String FileName; [Mess

我有一个WCF服务,需要从数据库返回一个文件。为此,我创建了两个MessageContract类,一个用于输入,一个用于输出。代码如下:

[MessageContract]
public class AttachmentFile
{
    [MessageHeader(MustUnderstand = true)]
    public Int32 AttachmentID;

    [MessageHeader]
    public String FileName;

    [MessageBodyMember(Order = 1)]
    public Stream Data;

    public AttachmentFile(Attachment att)
    {
        AttachmentID = (Int32)att.AttachmentID;
        FileName = att.FileName;
        Data = new MemoryStream(att.FileBytes);
    }
}

[MessageContract]
public class AttachmentFileID
{
    [MessageBodyMember]
    public Int32 AttachmentID;
}

public AttachmentFile GetAttachmentFile(AttachmentFileID AttachmentID)
{
}
生成的WSDL看起来是正确的:

<wsdl:operation name="GetAttachmentFile">
    <soap12:operation soapAction="http://tempuri.org/IAttachments/GetAttachmentFile" style="document"/>
    <wsdl:input name="AttachmentFileID">
        <soap12:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="AttachmentFile">
        <soap12:header message="i0:AttachmentFile_Headers" part="AttachmentID" use="literal"/>
        <soap12:header message="i0:AttachmentFile_Headers" part="FileName" use="literal"/>
        <soap12:body use="literal"/>
    </wsdl:output>
</wsdl:operation>

我肯定我错过了一些简单的东西,但我似乎找不到它是什么。有人知道这可能是什么原因吗?

进一步检查代码后,
/messageContract
开关修复了其中一个呼叫,但却搞糟了另一个呼叫。但是,使用/importXmlTypes开关修复了所有问题。

如果使用
/wrapped
参数调用
svcutil
会怎么样?这将防止“展开”参数(在您的情况下似乎会发生…)。另外-尝试svcutil上的
/messageContract
开关,告诉它您正在使用一个消息契约-有时会有帮助…没有什么不对-契约是相同的。你应该能够打电话给该客户的服务,它应该工作得很好。谢谢。/messagecontract开关成功了。我一弄明白怎么做,就接受你的回答。卡洛斯菲盖拉:虽然我知道这在技术上是正确的,而且会起作用,但现在是原始通话的编写方式,更糟糕的是,这不是直观的。在我们的代码中,我的老板永远不会接受这样的电话。
public string GetAttachmentFile(ref int AttachmentID, out System.IO.Stream Data)
{
    AttachmentFileID inValue = new AttachmentFileID();
    inValue.AttachmentID = AttachmentID;
    AttachmentFile retVal = ((IAttachments)(this)).GetAttachmentFile(inValue);
    AttachmentID = retVal.AttachmentID;
    Data = retVal.Data;
    return retVal.FileName;
}