这个是一个地方同时调用这个接口很多次(小于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 好像没设置过,应该是这个原因吧!!
每次调用完就 Close 掉。
服务引用有Close
UserAllInfoSoapClient msc = new UserAllInfoSoapClient()
msc.Close();
web 引用好像没找到Close
UserAllInfo msc = new UserAllInfo() msc.Close();
@bsso: web 引用的话,随时用,随时释放就行了,如下:
using(UserAllInfo msc = new UserAllInfo())
{
msc.GetUser("sdf");
}
@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: 你的代码是不是在方法一的时候出的问题?方法二会比较安全。
@Launcher:
嗯,我试一下方法二。
上面的问题我补充了一下,源码类似上面的,有时间你看一下!谢谢!
@Launcher:
WebService1SoapClient webSerSC = new WebService1SoapClient(); count = webSerSC.GetUserProductsCount(_id); //...加入缓存 webSerSC.Close();
悲剧还是依然没解决....
@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:
对就是这样,网站的子站相当多,并存在相互调用的情况。
我上面有个补充:可能是服务器配置的问题,管理员说没管过这那两个值。默认可能就是4分钟5000个端口。
@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:
问题解决了,是服务器配置的问题,但还是要谢谢你!
@bsso: 是怎么配置的?楼主说一下,我也遇到这个问题了
@bsso: 老板,怎么解决的?服务器设置怎么修改?我刚刚遇到这个问题愁死了