Svcutil.exe生成错误的方法类型

时间:2014-05-14 08:13:24

标签: c# wcf svcutil.exe

WCF新手在这里。 在我的解决方案中,我有3个项目:

  1. 共同逻辑
  2. 客户端
  3. 服务器
  4. ClientServer导入Common Logic

    我的服务器有一个名为GetNextFile的方法。这里是接口实现:

    [OperationContract]
    RemoteFileInfo GetNextFile(GUIDSetting GUID);
    

    此处RemoteFileInfoGUIDSetting的内容如下:

    [MessageContract]
    public class GUIDSetting
    {
        [MessageBodyMember]
        public string Guid;
    }
    
    [MessageContract]
    public class RemoteFileInfo : IDisposable
    {
        [MessageHeader(MustUnderstand = true)]
        public string FileName;
    
        [MessageHeader(MustUnderstand = true)]
        public long Length;
    
        [MessageHeader(MustUnderstand = true)]
        public string Status;
    
        [MessageBodyMember(Order = 1)]
        public Stream FileByteStream;
    
        public void Dispose()
        {
            if (FileByteStream != null)
            {
                FileByteStream.Close();
                FileByteStream = null;
            }
        }
    }
    

    这里是实际实现的片段:

    public RemoteFileInfo GetNextFile(GUIDSetting GUIDRequested)
    {
        //stuff
        return result;
    }
    

    当我使用svcutil生成我的代理时,我使用以下参数:

    svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost:8001/MyService/
    

    但生成的代理中的GetNextFile方法如下所示:

    public string GetNextFile(string Guid, out long Length, out string Status, out System.IO.Stream FileByteStream)
    {
        //stuff
    }
    

    这是生成的异步方法:

    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    System.Threading.Tasks.Task<RemoteFileInfo> IServiceFileStream.GetNextFileAsync(GUIDSetting request)
    {
        return base.Channel.GetNextFileAsync(request);
    }
    

    为什么会这样?我可以尝试找出为什么LenghtStatusStream作为out参数,但fileName在哪里?为什么Async方法有正确的参数( RemoteFileInfo GUIDSetting )?我在同步功能上需要这些参数,但我不知道如何实现它以及为什么svcutils.exe给我这个输出

1 个答案:

答案 0 :(得分:0)

如果您没有特别需要控制SOAP结构的组成方式,那么请尝试使用DataContract而不是MessageContract。

例如:

[DataContract]
public class GUIDSetting
{
    [DataMember]
    public string Guid;
}