首页 新闻 会员 周边

C# 无法加载或初始化请求的服务提供程序

0
悬赏园豆:200 [已解决问题] 解决于 2017-12-19 09:32

现在情况是这样的。只有少数的电脑出现了这个问题。我就写了几行get请求的代码,源码如下:

static void Main(string[] args)
{
string url = "http://xxx[此处是url]";
string para = "[此处是参数]";
string ret = HttpGet(url, para);
Console.WriteLine(ret);
Console.ReadLine();
}

public static string HttpGet(string Url, string postDataStr)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
            return retString;
        }
}

这个程序在绝大数windows计算机上都可以正常执行。并成功发起请求。但是在少数计算机上,会出现异常:

在异常stack里可以看到  【无法加载或初始化请求的服务提供程序】。这台电脑的环境是windows 。net也都是一样的4.0版本。但是不知道是出现了什么问题。出问题的计算机是可以正常上外网的在浏览器里,或者用python发请求都可以正常发出去。就是c#不行。不知道为什么,希望有经验的大佬们帮帮忙啊~~

阿卡林的主页 阿卡林 | 初学一级 | 园豆:8
提问于:2017-12-08 10:05
< >
分享
最佳答案
1

贴下堆栈信息,我感觉像.net framework有问题啊

 

看了下,你好像是盗版用户的受害者,激活下系统

收获园豆:100
Daniel Cai | 专家六级 |园豆:10424 | 2017-12-08 10:48

嗯  好的

阿卡林 | 园豆:8 (初学一级) | 2017-12-08 10:54
其他回答(4)
1

首先去使用restsharp,这样极大的简化代码,减少新手出错的过程。

var client = new RestClient(BaseUri);

var request = new RestRequest(RelativeUri);

var response = client.ExecuteRequest(request);

Console.WriteLine(response.Content);

花飘水流兮 | 园豆:13560 (专家六级) | 2017-12-08 10:16

非常感谢,但是现在项目都是用的老代码。客户那边着急用。

支持(0) 反对(0) 阿卡林 | 园豆:8 (初学一级) | 2017-12-08 10:18
2

问题可能是 response 没有关闭引起的,在发生异常时 myStreamReader 与 myResponseStream 也不会被关闭,建议修改为下面的代码

var request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
using (var response = (HttpWebResponse)request.GetResponse())
{
    using (var myStreamReader = new StreamReader(response.GetResponseStream(), 
        Encoding.GetEncoding("utf-8")))
    {
        return myStreamReader.ReadToEnd();
    }
}
收获园豆:100
dudu | 园豆:31007 (高人七级) | 2017-12-08 10:33

感谢大佬。但是这个应该是个环境问题。因为上述的代码在99%的电脑上都是可以执行的。

支持(0) 反对(0) 阿卡林 | 园豆:8 (初学一级) | 2017-12-08 10:37

不考虑服务器端的问题。是客户端请求发不出去。

支持(0) 反对(0) 阿卡林 | 园豆:8 (初学一级) | 2017-12-08 10:37

@阿卡林: 可能是 response 没有关闭引起所占用的 tcp 连接没被释放,从而达到了 WebRequest 的连接数限制

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2017-12-08 10:44

@dudu: 恩好滴 我去试试喵

支持(0) 反对(0) 阿卡林 | 园豆:8 (初学一级) | 2017-12-08 10:54
0

需要重置那个winsock相关的服务,重置前还需要关闭360等杀毒软件...

阿卡林 | 园豆:8 (初学一级) | 2017-12-19 09:32
0

请问最后解决了吗   我也遇到了

#山鸡 | 园豆:202 (菜鸟二级) | 2018-03-01 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册