WebClient.DownloadString在网站中失败,否则工作

时间:2016-03-01 14:32:42

标签: c#

在我们的MVC 5网站中,我们有VerifyEmail方法联系服务以检查是否存在电子邮件。我们进行基本的初步检查,以确保它看起来像是有效的电子邮件等,然后我们将其传递给服务。

我们正在使用WebClient.DownloadString()功能。当我们导航到适当的View并触发方法时,我们会收到以下错误:

调试时:

<h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>

当我们没有调试时,我们得到了这个:

  

System.Net.WebException:无法连接到远程服务器---&gt;   System.Net.Sockets.SocketException:无法建立连接,因为目标计算机主动拒绝它127.0.0.1:63595
    在System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,SocketAddress socketAddress)
    在System.Net.ServicePoint.ConnectSocketInternal(布尔值connectFailure,套接字s4,套接字s6,套接字和套接字,IPAddress&amp;地址,ConnectSocketState状态,IAsyncResult asyncResult,异常和异常)
    ---内部异常堆栈跟踪结束---

如果我从LinqPad调用方法(VerifyEmailOrgEmailVerificationClient.VerifyEmail),它可以工作!!!

我明白了:

MX record about emailserver.com exists.<br/>
Connection succeeded to emailserver-com.mail.protection.outlook.com SMTP.<br/>
220 SN1NAM01FT022.mail.protection.outlook.com Microsoft ESMTP MAIL Service ready at Mon, 29 Feb 2016 21:08:50 +0000<br/>
&gt; HELO verify-email.org<br/>
250 SN1NAM01FT022.mail.protection.outlook.com Hello [verify-email.org]<br/>
&gt; MAIL FROM: &lt;check@verify-email.org&gt;<br/>
=250 2.1.0 Sender OK<br/>
&gt; RCPT TO: &lt;redacted@emailserver.com&gt;<br/>
=250 2.1.5 Recipient OK<br/>

这就是我们应该得到的。因此,代码可以在LinqPad上运行,但是当我们将其称为网站时则不行。我们将测试方法放在一起并获得相同的结果。通过我们的测试,我们只是想从WebClient.DownloadString()获得回复。即便如此,我们也会收到错误。

这是我们的测试方法:

using System;
using System.IO;
using System.Net;
using System.Web.Mvc;
using PublicationSystem.ViewModels;

namespace TestWebClient.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var newModel = new TestViewModel();

            using (var webClient = new WebClient())
            {
                webClient.Encoding = System.Text.Encoding.UTF8;
                webClient.Headers["Content-Type"] = "application/json;charset=UTF-8";

                var requestUrl = string.Empty;// GetRequestUrl(email);
                try
                {
                    requestUrl =
                        "http://api.verify-email.org/api.php?usr=igiglobal&pwd=emailsareweak&check=mkenyon@mkptechnologies.com";
                    newModel.ResponseString = webClient.DownloadString(requestUrl);

                }
                catch (WebException exception)
                {
                    string responseText;

                    if (exception.Response != null)
                    {
                        using (var reader = new StreamReader(exception.Response.GetResponseStream()))
                        {
                            responseText = reader.ReadToEnd();
                        }
                        newModel.ResponseString = responseText;
                    }
                    else
                    {
                        newModel.ResponseString = exception.ToString();
                    }
                }
                catch (Exception exception)
                {
                    newModel.ResponseString = exception.ToString();
                }
            }

            return View(newModel);
        }

我们的AppPool设置为.Net 4.0。该应用程序编译为.Net 4.5。我们正在使用MVC 5.

知道为什么我们的方法,特别是WebClient.DownloadString()在我们运行网站时失败,但是如果我们从LinqPad调用代码那么有效吗?

更新: 我使用Visual Studio 2013创建了一个新的MVC项目,就像这个项目一样。在新的测试项目中,我粘贴了相同的代码,并尝试尽可能准确地匹配引用。我的代码在测试项目中工作。因此,设置项目的方式就是阻止WebClient.DownloadString()。使用Fiddler,它看起来甚至都没有发出请求。

在测试MVC网站时是否有可能阻止WebClient.DownloadString()的设置?

更新2: 在web.config中我找到了这个。这可能是吗?

<system.net>
  <defaultProxy>
    <proxy proxyaddress="http://localhost:63595/" />
  </defaultProxy>
</system.net>

1 个答案:

答案 0 :(得分:1)

在web.config中我找到了这个。评论它让WebClient.DownloadString()再次工作。希望这有助于某人。我将不得不对此进行更多的研究。

<system.net>
  <defaultProxy>
    <proxy proxyaddress="http://localhost:63595/" />
  </defaultProxy>
</system.net>