首页 新闻 会员 周边 捐助

WebService访问量大时报错:每个套接字地址(协议/网络地址/端口)只允许使用一次

0
悬赏园豆:15 [已解决问题] 解决于 2012-08-21 14:57

这个是一个地方同时调用这个接口很多次(小于N次,但最低大于50或100)时报错的。

并且还频繁调用.....

System.ServiceModel.CommunicationException: 无法连接到 http://192.168.1.21/Services/WebService1.asmx。TCP 错误代码 10048: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 192.168.1.21:80。 ---> System.Net.WebException: 无法连接到远程服务器 ---> System.Net.Sockets.SocketException: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 192.168.1.21:80
在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
在 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
--- 内部异常堆栈跟踪的结尾 ---
在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
在 System.Net.HttpWebRequest.GetRequestStream()
在 System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
--- 内部异常堆栈跟踪的结尾 ---

Server stack trace:
在 System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
在 System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout)
在 System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
在 MyWeb.WebService1Soap.GetUser(GetUserRequest request)
在 MyWeb.WebService1SoapClient.MyWeb.WebService1Soap.GetUser(GetUserRequest request) 位置 E:\Web\MyWeb\Service References\WebService1\Reference.cs:行号 1350
在 MyWeb.WebService1SoapClient.GetUser(String userid) 位置 E:\Web\MyWeb\Service References\WebService1\Reference.cs:行号 1357

 

有人说挂起一下[ System.Threading.Thread.Sleep(0) ],好像也没用!!

请问大家有没有碰到过类似的问题,并有没有好像方法或建议?

 

----------------------

源码类似下面:

子网站一服务引用:

public user GetUser(string uid)
{
      UserAllInfoSoapClient msc = new UserAllInfoSoapClient();
      msc.GetUser("ddd");
}
public user GetUser2()
{
       UserAllInfoSoapClient msc = new UserAllInfoSoapClient();

       foreach (string uid in uidLists)
       {
msc.GetUser("ddd"); }

}
 

 

 

子网站二web 引用:

public user GetUser(string uid)
{
     UserAllInfo msc = new UserAllInfo();
     msc.GetUser("ddd"); 
}
public user GetUser2()
{
UserAllInfo msc = new UserAllInfo();
       foreach (string uid in uidLists)
       {
msc.GetUser("ddd"); }

}

补充:

网站用的是Microsoft Windows Server™ 2003 服务器 TcpTimedWaitDelay 和 MaxUserPort 好像没设置过,应该是这个原因吧!!

bsso的主页 bsso | 初学一级 | 园豆:196
提问于:2012-08-15 15:27
< >
分享
最佳答案
0

每次调用完就 Close 掉。

收获园豆:15
Launcher | 高人七级 |园豆:45050 | 2012-08-15 15:33

服务引用有Close

UserAllInfoSoapClient msc = new UserAllInfoSoapClient()
msc.Close();

 

web 引用好像没找到Close

UserAllInfo msc = new UserAllInfo()
msc.Close();

 

 

bsso | 园豆:196 (初学一级) | 2012-08-15 15:52

@bsso: web 引用的话,随时用,随时释放就行了,如下:

using(UserAllInfo msc = new UserAllInfo())

{

     msc.GetUser("sdf");
}

Launcher | 园豆:45050 (高人七级) | 2012-08-15 16:12

@Launcher: 

方法一:
                 using (UserAllInfo msc = new UserAllInfo())
                {
                    foreach (string uid in uidLists)
                    {
                        msc.GetUser(uid);
                    }
                }

方法二:      
                foreach (string uid in uidLists)
                {
                    using (UserAllInfo msc = new UserAllInfo())
                    {
                        msc.GetUser(uid);
                    }
                }

是这种情况?用那一个呢?
bsso | 园豆:196 (初学一级) | 2012-08-15 16:31

@bsso: 你的代码是不是在方法一的时候出的问题?方法二会比较安全。

Launcher | 园豆:45050 (高人七级) | 2012-08-15 16:33

@Launcher: 

嗯,我试一下方法二。

上面的问题我补充了一下,源码类似上面的,有时间你看一下!谢谢!

bsso | 园豆:196 (初学一级) | 2012-08-15 16:56

@Launcher: 

      WebService1SoapClient webSerSC = new WebService1SoapClient();
      count = webSerSC.GetUserProductsCount(_id);
      //...加入缓存
      webSerSC.Close();

 悲剧还是依然没解决....

bsso | 园豆:196 (初学一级) | 2012-08-16 09:06

@bsso: 我梳理下你的程序结构,在 http://192.168.1.21/Services/WebService1.asmx 处有一 web service 服务,在 http://192.168.1.11/Web.aspx 有一页面,在 Web.aspx中你使用了如下代码调用 前面提到的 web service:

public user GetUser2()
{
       UserAllInfoSoapClient msc = new UserAllInfoSoapClient();

       foreach (string uid in uidLists)
       {
msc.GetUser("ddd"); }

你的错误提示是从上述代码的 msc.GetUser("ddd"); 这句代码抛出的。
我描述的正确否?
Launcher | 园豆:45050 (高人七级) | 2012-08-16 09:23

@Launcher: 

对就是这样,网站的子站相当多,并存在相互调用的情况。

我上面有个补充:可能是服务器配置的问题,管理员说没管过这那两个值。默认可能就是4分钟5000个端口。

bsso | 园豆:196 (初学一级) | 2012-08-16 09:52

@bsso: 你需要先做个测试,建立一个Console或者WinForm程序,使用你的下列代码调用 http://192.168.1.21/Services/WebService1.asmx 处的服务:

public user GetUser2()
{
       UserAllInfoSoapClient msc = new UserAllInfoSoapClient();

       foreach (string uid in uidLists)
       {
msc.GetUser("ddd"); }

测试此程序是否会出现相同的问题。
Launcher | 园豆:45050 (高人七级) | 2012-08-16 09:59

@Launcher: 

问题解决了,是服务器配置的问题,但还是要谢谢你!

bsso | 园豆:196 (初学一级) | 2012-08-21 14:56

@bsso: 是怎么配置的?楼主说一下,我也遇到这个问题了

杨智卿 | 园豆:0 (初学一级) | 2014-05-04 13:27

@bsso: 老板,怎么解决的?服务器设置怎么修改?我刚刚遇到这个问题愁死了

八戒的师傅 | 园豆:1472 (小虾三级) | 2014-11-27 23:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册