Префикс URI не распознается OnDownloadStringCompleted - PullRequest
1 голос
/ 10 августа 2011

У меня проблема с простым методом, который получает строку из asp.net 4 ashx. Я использую следующие методы из приложения silverlight, которое размещается в этом приложении asp.net.

private void LoadPlugins()
{
    var serviceAddress = _baseAddress
        + "PluginsService.ashx?"
        + DateTime.Now.Ticks;

    var client = new WebClient();
    client.DownloadStringCompleted += client_DownloadStringCompleted;
    client.DownloadStringAsync(new Uri(serviceAddress));
}

void client_DownloadStringCompleted(
    object sender,
    DownloadStringCompletedEventArgs e)
{
    var plugins = e.Result.Split(
        new string[] { Environment.NewLine },
        StringSplitOptions.RemoveEmptyEntries);
    foreach (var plugin in plugins)
    {
        AddXap(_baseAddress + plugin);
    }
}

PluginsService.ashx.cs:

namespace MefPlugins.Web
{
    /// <summary>
    /// Summary description for PluginsService
    /// </summary>
    public class PluginsService : IHttpHandler
    {
        private const string PluginsFolderName = "Plugins/";

        public void ProcessRequest(HttpContext context)
        {
            //var pluginFolder = new DirectoryInfo(
            //    HttpContext.Current.Server.MapPath(
            //    PluginsFolderName));
            //var response = new StringBuilder();

            //if (pluginFolder.Exists)
            //{
            //    foreach (var xap in pluginFolder.GetFiles("*.xap"))
            //    {
            //        response.AppendLine(
            //            PluginsFolderName + xap.Name);
            //    }
            //}

            var response = new StringBuilder();
            response.Append("test");
            context.Response.ContentType = "text/plain";
            context.Response.Write(response);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

Я получаю ошибку:

System.Reflection.TargetInvocationException не было обработано кодом пользователя Сообщение = во время операции возникла исключительная ситуация, что делает результат недействительным. Проверьте InnerException для подробностей исключения. Трассировки стека: w System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNeeded () w System.Net.DownloadStringCompletedEventArgs.get_Result () w MefPlugins.MainPage.client_DownloadStringCompleted (Отправитель объекта, DownloadStringCompletedEventArgs e) w System.Net.WebClient.OnDownloadStringCompleted (DownloadStringCompletedEventArgs e) w System.Net.WebClient.DownloadStringOperationCompleted (Object arg) InnerException: System.Net.WebException Сообщение = Возникла исключительная ситуация во время запроса WebClient. InnerException: System.NotSupportedException Сообщение = префикс URI не распознан. Трассировки стека: w System.Net.WebRequest.Create (Uri requestUri) w System.Net.WebClient.GetWebRequest (адрес Uri) w System.Net.WebClient.DownloadStringAsync (адрес Uri, объект userToken) InnerException:

Где может быть ошибка? это пример из http://www.galasoft.ch/sl4u/code/chapter20/20.02-Mef/MefPlugins.zip

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Причина ошибки заключается в том, что проект является объектом запуска, выбранным в качестве проекта запуска.

Когда ваш проект запуска представляет собой проект MefPlugins (проект Silverlight) t, настройки проекта указывают, что веб-страница должна динамически создаваться для размещения приложения Silverlight (щелкните проект правой кнопкой мыши,выберите Свойства и перейдите на вкладку Отладка).

Проблема, с которой вы столкнулись, связана с расположением, используемым в качестве префикса для файла PluginsService.ashx._baseAddress устанавливается в конструкторе главной страницы следующим кодом:

var xapUri = App.Current.Host.Source;
_baseAddress = xapUri.AbsoluteUri
                     .Substring(0, xapUri.AbsoluteUri.IndexOf(xapUri.AbsolutePath)) 
               + "/";

Это означает, что Uri файла xap используется для определения базового URI.Теперь, когда в проекте используется динамически сгенерированная страница контейнера, которая находится на вашем жестком диске и запущена оттуда, вышеприведенный код получает корень файловой системы _baseAddress.Очевидно, что код не найдет страницу PluginsService.ashx, так как ее там нет.

Кроме того, для файла .ashx требуется некоторая форма прослушивателя http, которая направляет запрос от порта на вашу страницу .ashx.Слушателем может быть веб-сервер, такой как IIS, или веб-сервер разработки, или какой-либо прослушиватель, который вы внедрили самостоятельно.

Чтобы решить эту проблему, создайте проект запуска MefPlugins.Web и установите MefPluginsTestPage.aspx как стартовая страница.Теперь _baseAddress должно быть чем-то похожим на http://localhost:6584/.

Когда этот базовый адрес теперь используется для поиска страницы PluginsService.ashx, это приведет к правильному URI для ресурса (http://localhost:6584/PluginsService.ashx в нашем случае).

В общем .ashx файлы являются расширениями веб-службы (IIS, отладочный веб-сервер или даже некоторые собственные реализации), они не часть клиента Silverlight.

1 голос
/ 12 августа 2011

Я подозреваю, что проблема в том, что Uri, который вы передаете DownloadStringAsync, является относительным Uri. То есть: «file: //PluginsService.ashx» относительно текущего каталога. Возможно, вам нужен абсолютный Uri (то есть полное имя пути), как в "file: // C: \ projects \ test \ PluginsService.ashx".

...