遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

wCF REST

关于UriTemplate

通过浏览器直接访问需要使用WebGet标注

使用WebInvoke(UriTemplate = "ip/{btime}/{clientId}") 这样的属性时,方法参数列表需要时字符串类型
使用ip?btime={bitme}&clientId={clientId} 则可使用对应类型的方法定义
即UriTemplate部分的参数需要使用字符串理想而Query部分(?后面)可以使用对应类型

关于连接问题
测试了下面的代码(使用 netstat -p tcp 查看)

View Code
        static List<object> list = new List<object>();
        static ChannelFactory<IDynamicIpService> channelFactory = new ChannelFactory<IDynamicIpService>("DynamicIpService");

        static void Main(string[] args)
        {
            //for (int i = 1; i < 10; i++)
            //{
                
               

            //        IDynamicIpService proxy = channelFactory.CreateChannel();
            //        IDynamicIpService proxy2 = channelFactory.CreateChannel();
            //        IDynamicIpService proxy3 = channelFactory.CreateChannel();
            //        proxy.RegIp("1000");
            //        proxy2.RegIp("1001");
            //        proxy3.RegIp("1002");


            //        //(proxy as ICommunicationObject).Close();
            //        //(proxy2 as ICommunicationObject).Close();
            //        //(proxy3 as ICommunicationObject).Close();

            //        //channelFactory.Close();
                
                
            //}
            IDynamicIpService proxy4 = channelFactory.CreateChannel();
            proxy4.RegIp("1005");
            Console.ReadKey();

            Console.WriteLine("再高次!");
            //IDynamicIpService proxy4 = channelFactory.CreateChannel();
            proxy4.RegIp("1004");
            Console.WriteLine("又搞好一次!");
            Console.ReadKey();
        }

发现一个console进程会开启一个tcp连接,tcp连接数跟proxy个数,channelFactory个数没关心,显式关闭proxy,channelFactory都不影响tcp连接的关闭,
tcp连接在到了其超时时间后自动关闭,而且再次使用proxy时会重新生成tcp连接(当然对于的channelFactory与proxy不要使用close()关闭);

具体Demo

下载

注意点:服务器启动代码(console)

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Web;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Web.Routing;
namespace DynamicIP.Server
{
    class Program
    {
        static void Main(string[] args)
        {
            //不使用配置文件时需要给出Uri
            //WebServiceHost host = new WebServiceHost(typeof(ServiceImp), new Uri("http://192.168.1.30:5555"))

            //使用配置文件时,配置文件endpoint的name属性必需是ServiceImp的完全限定名
            //多个服务需要使用多个host,不过一般用iis来做
            //或者ServiceImp实现N多个接口(部分类)
            using (WebServiceHost host = new WebServiceHost(typeof(ServiceImp)))
            {


                host.Open();
                Console.WriteLine("服务器启动");
                Console.Read();
            }


        }
    }
}

服务端配置文件:

View Code
<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="DynamicIP.Server.ServiceImp">
        <endpoint address="http://192.168.1.30:5555"
                  binding="webHttpBinding"
                  contract="DynamicIP.Interface.IService"/>
        <endpoint address="http://192.168.1.30:5555/Math"
          binding="webHttpBinding"
          contract="DynamicIP.Interface.IMyMath"/>
      </service>
    </services>
  </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>

</configuration>

 

posted on 2013-04-12 10:52  遗忘海岸  阅读(761)  评论(0编辑  收藏  举报