2011-09-14 9 views
0

データベースからファイルを返す必要があるWCFサービスがあります。そのために、2つのMessageContractクラスを作成しました.1つは入力用、もう1つは出力用です。コードは以下の通りである:WCFプロキシが正しく生成されない

[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> 

私はsvcutil.exe http://localhost:8002/IAttachments?wsdlを実行したときしかし、生成されたコードが出てくる:私は

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; 
} 

私は何かシンプルなものを見逃していると確信していますが、それが何であるかを見つけることができません。誰かがこれを引き起こしている可能性のある手がかりを持っていますか?

+2

'/ wrapped'パラメータで' svcutil'を呼び出すとどうなりますか?これはパラメータのアンラッピングを防止します(あなたのケースで起こるようです...)。また、svcutilの '/ messageContract'スイッチを使用して、メッセージ契約を使用していることを伝えてください。時々役に立ちます... –

+0

何も間違っていません - 契約は同じです。あなたはそのクライアントとサービスを呼び出すことができるはずです、それはうまくいくはずです。 – carlosfigueira

+0

ありがとうございます。/messagecontractスイッチがトリックを行いました。方法を見つけたら、私はあなたの答えを受け入れます。 carlosfigueira:技術的に正しいとわかっていますが、元の呼び出しがどのように書かれていたか、さらに悪化しています。直感的ではありません。私の上司は、私たちのコードでそのような呼び出しを受け入れることは決してありません。 –

答えて

1

さらにコードを調べると、/messageContractスイッチは、1つのコールを固定して別のコールを固定します。ただし、/ importXmlTypesスイッチを使用するとすべてが修正されました。

関連する問題