messagecontract和tcp绑定的问题

时间:2012-06-30 15:41:19

标签: wcf tcp message

我有一个wcf服务,它是异步并使用net tcp绑定。到现在为止,它运作正常。我可以获取元数据,为客户端生成代理类......等等。

但是,我需要定义一个消息合约,因为我需要从客户端向服务发送文件。这个类在一个公共库中,我也有STE(自我跟踪实体)。

另外,我在服务中添加了新的异步方法,让我发送文件。

我的留言合同如下:

[MessageContract]
public class FileDataStream : IDisposable
{
    //[MessageHeader(MustUnderstand = true)]
    public string Name {get; set;}

    //[MessageBodyMember(Order = 1)]
    public System.IO.Stream DataStream {get; set;}
}

如果我使用这个类,当我尝试以与我过去相同的方式获取元数据时,现在在Internet Explorer中说我无法找到该页面。客户端无法连接。如果我使用netstat -ona |找到“7997”我什么都没得到,所以服务运行不正常。

但是,如果在我的消息合同类中我删除了messagecontract属性,那么一切正常。当我的意思是一切正常时,因为服务运行正常。

但是,文件的二进制信息未正确到达服务。在我读到的关于WCF中文件传输的示例中,我总是看到使用了消息合同,因为要发送更多信息,比如文件名,需要消息合同。

所以我想知道我做错了什么。在其他情况下,当我无法获取元数据时,是因为我没有正确设置绑定,但是当我想使用消息合同时,我不知道是否需要特殊配置。

我的服务配置如下:

<configuration>
  <system.serviceModel>
    <bindings>


      <netTcpBinding>
        <binding name="ServiceDocumentos" maxBufferSize="2147483647"
                      maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"
                       transferMode="Streamed" closeTimeout="00:01:00"
                       openTimeout="00:01:00" receiveTimeout="00:20:00"
                       sendTimeout="00:01:00" maxConnections="100">
          <security mode="None"/>
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxStringContentLength="2147483647"/>
        </binding>

        <binding name="ServiceCore" maxBufferSize="67108864"
                      maxReceivedMessageSize="67108864" maxBufferPoolSize="67108864"
                       transferMode="Buffered" closeTimeout="00:01:00"
                       openTimeout="00:01:00" receiveTimeout="00:20:00"
                       sendTimeout="00:01:00" maxConnections="100">
          <security mode="None"/>
          <readerQuotas maxArrayLength="67108864" maxBytesPerRead="67108864" maxStringContentLength="67108864"/>
          <reliableSession enabled="true" inactivityTimeout="00:20:00" />
        </binding>
      </netTcpBinding>      
    </bindings>

    <services>
      <service behaviorConfiguration="CMMSService" name="GTS.CMMS.Service.Service">

        <endpoint binding="netTcpBinding" bindingConfiguration="ServiceDocumentos"
                 name="ServiceDocumentos" contract="GTS.CMMS.Service.IServiceDocumentos"
         address="ServiceDocumentos/">
        </endpoint>

        <endpoint address ="ServiceCore/"
                 binding="netTcpBinding" bindingConfiguration="ServiceCore"
                 name="ServiceCore" contract="GTS.CMMS.Service.IService">
        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"
                 listenUriMode="Explicit">
        </endpoint>

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:7997/CMMSService" />
            <add baseAddress="net.tcp://localhost:7998/CMMSService" />
          </baseAddresses>
        </host>


      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CMMSService">
          <serviceMetadata httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="false" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />

          <serviceThrottling
                    maxConcurrentCalls="64"
                    maxConcurrentInstances="2147483647"
                    maxConcurrentSessions="50"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

感谢。

0 个答案:

没有答案