0

我一直在关注各种教程,这些教程解释了如何通过上传文件WCF,当我尝试MessageContract在客户端和服务器之间共享包含的类时遇到了一些问题。

基本上我的问题如下:

RemoteFileInfo MessageContract在一个单独的类库中有一个类:

[MessageContract]
public class RemoteFileInfo : IDisposable
{

    private System.IO.Stream fileByteStream;

    [MessageBodyMember(Order = 1)]
    public System.IO.Stream FileByteStream
    {
        set { this.fileByteStream = value; }
        get { return this.fileByteStream; }
    }

    /*More properties here declared as regular properties or [MessageHeader]*/
}

然后我与服务器和客户端共享该库。这应该意味着客户端不应该实现自己的RemoteFileInfo类。但是,在我将 .dll 添加到我的客户端项目然后使用Add Service Reference启用Reuse Types后,它仍然RemoteFileInfo会在服务引用的命名空间内重新创建类,这会在它本身与我最初在其中声明它的类库中的类型之间产生歧义。

MessageContract所以我的问题是,如何在客户端和服务器之间共享一个已声明为 a 的类?我需要这样做,因为我OperationContract需要一个RemoteFileInfo对象,并且我想保留我在原始RemoteFileInfo类中声明的相同属性。

我的OperationContract

    [OperationContract]
    void uploadFile(RemoteFileInfo request);

我希望能够在客户端上准确地调用该方法在服务合同中的声明方式。到目前为止,即使我Generate message headers在添加服务引用时使用该选项,我最终还是得到了一个uploadFile具有byte[]参数而不是流的方法,并且我需要它是一个流。

有任何想法吗?

编辑:我打算发布一个客户端配置,但我需要提到我正在为 Windows 应用商店应用程序开发,所以我没有传统的 app.config。

下面是 WCF 测试客户端为客户端配置生成的内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IRTMobileWebService" sendTimeout="00:05:00" />
      </basicHttpBinding>
      <netTcpBinding>
        <binding name="uploadEndpoint" sendTimeout="00:05:00" transferMode="Streamed">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint address="http://ipaddress/RTWebServices/RTMobileWebService.svc/basic"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRTMobileWebService"
          contract="IRTMobileWebService" name="BasicHttpBinding_IRTMobileWebService" />
      <endpoint address="net.tcp://ipaddress/RTWebServices/RTMobileWebService.svc/upload"
          binding="netTcpBinding" bindingConfiguration="uploadEndpoint"
          contract="IRTMobileImageService" name="uploadEndpoint">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

我将如何在没有 app.config 的 Windows 商店应用程序中复制它?

4

1 回答 1

1

如果您正在与已经在其中的服务接口共享一个 dll,那么您不应该费心使用向导添加服务引用 - 它会在很长一段时间内遗漏一些东西并创建一大堆更多代码在很多情况下,包括一个全新的服务接口实例。

相反,在使用服务的应用程序中,为服务创建自己的代理类,如下所示:

class ClientServiceClass : ClientBase<ITheServiceContract>, ITheServiceContract
{

    public ClientServiceClass ( string endpointConfigurationName ) :
        base( endpointConfigurationName )
    {
    }

    internal void uploadFile(RemoteFileInfo request)
    {
        Channel.uploadFile(request);
    }
}

ITheServiceContract您的共享 dll 中的接口在哪里,即服务合同,并且ClientServiceClass是您想要调用服务代理类的实现的任何内容(向导通常通过服务名称调用它)。

要在您的代码中使用该服务,请执行以下操作:

NetTcpBinding binding = new NetTcpBinding();
binding.TransferMode = TransferMode.Streamed;
binding.Security = new NetTcpSecurity();
binding.Security.Mode = SecurityMode.None;
EndpointAddress address = new EndpointAddress("net.tcp://serviceEndpointAddress");
ClientServiceClass uploadClient = new ClientServiceClass(binding, address);
uploadClient.Open( );
uploadClient.uploadFile( yourFileInfoRequest );
uploadClient.Close( );
于 2014-12-24T19:20:17.900 回答