Я недолго бился головой об стену из-за этой проблемы. Вот то, что я узнал и как я наконец обошел это.
Класс Prism FileDownloader использует System.Net.WebClient для загрузки модулей. В режиме OOB WebClient, похоже, использует тот же стек, что и IE, но, по-видимому, либо не отправляет сертификат клиента, либо (что более вероятно) неправильно согласовывает рукопожатие сертификата SSL / клиента с сервером. Я говорю это потому что:
- Мне удалось успешно запросить файлы .xap с помощью Firefox и Chrome;
- Я не смог успешно запросить файлы .xap с помощью IE;
- IIS потерпит неудачу с 500, а не с 403.
Я не мог понять, что на самом деле происходит по проводам; если бы я использовал Fiddler, он бы работал, потому что Fiddler перехватывает связь с сервером и обрабатывает рукопожатие сертификата клиента. И попытка использовать перехватчик пакетов, очевидно, ничего не скажет из-за SSL.
Итак - я сначала потратил много времени на стороне сервера, пытаясь устранить вещи (ненужные обработчики, модули, функции и т. Д.), Которые могут вызывать проблему.
Когда это не сработало, я попытался изменить исходный код Prism, чтобы использовать стек HTTP браузера вместо WebClient. Для этого я создал новый класс, похожий по дизайну на FileDownloader, реализующий IFileDownloader, который использовал стек браузера. Затем я внес некоторые изменения в XapModuleTypeLoader (который создает экземпляр загрузчика), чтобы он использовал новый класс. Этот подход не удался с той же ошибкой, с которой я первоначально столкнулся.
Затем я начал исследовать, доступен ли коммерческий стек HTTP сторонних производителей. Я нашел тот, который поддерживал нужные мне функции и поддерживал среду выполнения Silverlight 4. Я создал другую реализацию IFileDownloader, которая использовала этот стек, и BOOM - это сработало.
Хорошей новостью этого подхода является то, что я могу не только использовать его для загрузки модулей, но также использовать его для защиты связи между клиентом и нашим REST API (преимущество, которое мы собирались отказаться до этого).
Я планирую отправить патч в Prism, чтобы позволить загрузчику быть зарегистрированным или привязанным извне, поскольку в настоящее время он жестко запрограммирован на использование собственного FileDownloader. Если кто-то заинтересован в этом или в коммерческом стеке HTTP, который я использую, свяжитесь со мной (msimpson -at- abelsolutions -dot-com) для ссылок и примеров кода.
И я должен сказать это - я до сих пор не знаю наверняка, есть ли проблема с корнем в стеке HTTP на стороне клиента или на стороне сервера, но, тем не менее, это СБОЙ со стороны Microsoft.