Зачем возвращать ошибку 500 при вызове другого контроллера с помощью WebClient?

Я тестирую пример по этой ссылке: http://msdn.microsoft.com/en-us/vs11trainingcourse_aspnetmvc4_topic5#_Toc319061802, но у меня ошибка 500 при вызове другого контроллера с помощью WebClient.

Когда я обращаюсь к "http://localhost:2323/photo/gallery напрямую, я работаю, но я пытаюсь выполнить действие с помощью WebClient, он возвращает ошибку 500? Почему?"

   public ActionResult Index()
    {
        WebClient client = new WebClient();
        var response = client.DownloadString(Url.Action("gallery", "photo", null, Request.Url.Scheme));


        var jss = new JavaScriptSerializer();
        var result = jss.Deserialize<List<Photo>>(response);

        return View(result);
    }

Ошибка 500, созданная следующим исключением:

[ArgumentNullException: Value cannot be null.
Parameter name: input]
   System.Text.RegularExpressions.Regex.Match(String input) +6411438
   Microsoft.VisualStudio.Web.Runtime.Tracing.UserAgentUtilities.GetEurekaVersion(String userAgent) +79
   Microsoft.VisualStudio.Web.Runtime.Tracing.UserAgentUtilities.IsRequestFromEureka(String userAgent) +36
   Microsoft.VisualStudio.Web.Runtime.Tracing.SelectionMappingExecutionListenerModule.OnBeginRequest(Object sender, EventArgs e) +181
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +69

person oguzh4n    schedule 24.05.2012    source источник


Ответы (2)


Трудно сказать. Может быть, действие контроллера, которое вы вызываете, требует авторизации? Или использует сессию? Когда вы отправляете запрос WebClient, он не делегирует какие-либо клиентские файлы cookie, отправленные клиентом, действию Index.

Вот как вы можете отладить свой код и увидеть точный ответ, возвращаемый сервером:

WebClient client = new WebClient();
try
{
    var response = client.DownloadString(Url.Action("gallery", "photo", null, Request.Url.Scheme));
}
catch (WebException ex)
{
    using (var reader = new StreamReader(ex.Response.GetResponseStream()))
    {
        string responseText = reader.ReadToEnd(); // <-- Look here to get more details about the error
    }
}

И если выяснится, что проблема связана с сеансом ASP.NET, от которого зависит действие вашего целевого контроллера, вот как вы можете делегировать клиентские файлы cookie с запросом:

WebClient client = new WebClient();
client.Headers[HttpRequestHeader.Cookie] = Request.Headers["Cookie"];
person Darin Dimitrov    schedule 24.05.2012
comment
Похоже, есть какая-то проверка пользовательского агента. Попробуйте установить его при отправке запроса так же, как я показал с кукой. Но это трудно сказать, не зная, что делает ваше целевое действие. - person Darin Dimitrov; 24.05.2012

ошибка произошла из-за заголовка User-Agent

Разрешение:

public ActionResult Index()
    {
        WebClient client = new WebClient();
        client.Headers[HttpRequestHeader.UserAgent] = Request.Headers["User-Agent"];
        var response = client.DownloadString(Url.Action("gallery", "photo", null, Request.Url.Scheme));


        var jss = new JavaScriptSerializer();
        var result = jss.Deserialize<List<Photo>>(response);

        return View(result);
    }
person oguzh4n    schedule 24.05.2012
comment
Я думаю, вы должны были наградить Дарина Димитрова правильным ответом, поскольку он в основном сказал вам, что такое ответ, в комментарии к его первоначальному ответу. Размещение рабочего кода в качестве вашего ответа кажется (мне) кражей его кредита. Вам не кажется? - person Oliver; 03.09.2012