使用WCF Web服务

时间:2010-06-10 19:33:24

标签: c# .net wcf

我有一个简单的Web服务正在运行,我有一个控制台应用程序客户端正在使用该服务。我确实遇到了这个问题,我得到了社区中一些优秀人才的帮助。

我还有另一个问题:如果我想在循环中从客户端调用服务,它就不起作用了。它只是第一次工作,然后它一直在等待。为什么会发生这种情况,我该如何解决呢。

代码:

namespace WebService 
{ 
   [ServiceContract] 
   public interface IService 
   { 
     [OperationContract(Name="Result")] 
     [WebGet(UriTemplate = "/")] 
     Stream Result();   
   } 

   public class Service:IService 
   { 
        public Stream Result() 
        { 
           // read a file from the server and return it as stream 
        } 
   } 
}

The client:
namespace WebServiceClient
{
   [ServiceContract] 
   public interface IService 
   { 
     [OperationContract(Name="Result")] 
     [WebGet(UriTemplate = "/")] 
     Stream Result();   
   } 

}

static void Main()
{

     Console.WriteLine("Press enter when the service is available");
     Console.ReadLine();

     // creating factory
     HttpChunkingBinding binding = new HttpChunkingBinding();
     binding.MaxReceivedMessageSize = 0x7fffffffL;

     ChannelFactory<WebServiceClient.IService> factory = new   ChannelFactory<WebServiceClient.IService>
            (binding, new EndpointAddress("http://localhost/WebService/Service"));

            WebServiceClient.IService service = factory.CreateChannel();

       for(int i = 0; i < 10; i++)
       {
            Stream s = service.Result();
            // write this stream to a file and close the stream
       }

            //Closing our channel.
            ((IClientChannel)service).Close();

}

谢谢,

3 个答案:

答案 0 :(得分:1)

只是一个猜测,但听起来它与您关闭服务的连接没有关闭...尝试以下内容:

   for(int i = 0; i < 10; i++) 
   { 
        ChannelFactory<WebServiceClient.IService> factory = 
           new ChannelFactory<WebServiceClient.IService>(
               binding, 
               new EndpointAddress("http://localhost/WebService/Service")); 

        WebServiceClient.IService service = factory.CreateChannel(); 
        using(service as IDsposable)
        {
          using(MemoryStream s = service.Result() as MemoryStream)
          {
             // write this stream to a file
          }
        }
   } 

答案 1 :(得分:0)

你还没有发布代码,所以我会猜测:

您将最大打开连接数设置为1,并且正在循环中打开与Web服务的连接,但不会将该连接作为循环的一部分关闭。这会产生第二次迭代等待第一次连接超时的情况(可能设置为10分钟)。

答案 2 :(得分:0)

看起来您正在尝试实施Chunking频道。 看一下定义如何实现它的article

在文章的底部附近,explains如何设置WCF示例项目。示例项目中有一个分块示例。

我很确定连接没有关闭,因为你还没有读完所有数据。因为您是Chunking,所以并非所有数据都是同时传递的。你要求一个块,处理它然后再要一块。

祝你好运,

帕特里克