Silverlight 5 + Internet Explorer 9, использующий старый Content-Type из POST в последующем GET? - PullRequest
2 голосов
/ 10 января 2012

Мы столкнулись с супер раздражающей проблемой на работе.После того, как наше приложение Silverlight выполнит вход в систему POST, следующий GET, который мы отправим, завершится с ошибкой NotFoundException.Это происходит только при использовании среды выполнения Silverlight 5 и только в Internet Explorer 9. Сейчас я тестировал Silverlight 4, а также Chrome, Firefox, Opera и Safari, и IE9 / SL5 - единственная плохая комбинация.

Вот заголовки нашего логина POST:

POST /login HTTP/1.1<br> Accept: application/xml<br> Referer: <a href="http://localhost:8080/censored.xap?timestamp=1326148328000" rel="nofollow">http://localhost:8080/censored.xap?timestamp=1326148328000</a><br> Accept-Language: en-CA<br> Content-Length: 38<br> Content-Type: application/x-www-form-urlencoded<br> Accept-Encoding: gzip, deflate<br> User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)<br> Host: localhost:8080<br> Connection: Keep-Alive<br> Pragma: no-cache<br> Cookie: JSESSIONID=DEFEAFD35E9B067A79F772C166937750

Вот заголовки нашего следующего GET:

GET /user/current HTTP/1.1<br> Accept: application/xml<br> Referer: <a href="http://localhost:8080/censored.xap?timestamp=1326148328000" rel="nofollow">http://localhost:8080/censored.xap?timestamp=1326148328000</a><br> Accept-Language: en-CA<br> Content-Length: 38<br> Content-Type: application/x-www-form-urlencoded<br> Accept-Encoding: gzip, deflate<br> User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)<br> Host: localhost:8080<br> Proxy-Connection: Keep-Alive<br> Pragma: no-cache<br> Cookie: JSESSIONID=5C57C93458E80E5975470F703B4A483C<br>

Уведомлениечто Content-Type и Content-Length идентичны, даже если:

  • Вы не можете использовать Content-Type или Content-Length для GET
  • Длина содержимогона самом деле отличается в запросе GET, поэтому, очевидно, это старое значение

Кто-нибудь еще сталкивался с этим?

ОБНОВЛЕНИЕ: Это происходит только при использовании BrowserHttp.

ЗдесьВот пример кода клиента:

using System;
using System.IO;
using System.Net;
using System.Net.Browser;
using System.Windows.Controls;

namespace NetworkTest
{
public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
        HttpWebRequest request = (HttpWebRequest)WebRequestCreator.BrowserHttp.Create(new Uri("http://localhost:59050/Home/Login"));
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.BeginGetRequestStream(result =>
            {
                var rq = result.AsyncState as HttpWebRequest;

                using (var stream = rq.EndGetRequestStream(result))
                {
                    StreamWriter writer = new StreamWriter(stream);
                    writer.WriteLine("username=test&password=test");
                    writer.Flush();
                    writer.Close();
                }

                rq.BeginGetResponse(
                    r =>
                    {
                        try
                        {
                            rq.EndGetResponse(r);
                        }
                        catch
                        {
                        }
                    }, rq);
            }, request);
    }
}
}

Пример кода сервера (из ASP MVC 3):

using System.Web.Mvc;

namespace TestServer.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(string test)
        {
            return RedirectToAction("Index");
        }
    }
}

В конечном итоге вы видите POST для входа, которыйуспешный запрос.Вы будете перенаправлены обратно на страницу индекса, и GET по-прежнему будет содержать Content-Type и Content-Length из POST, поэтому он не будет работать.

Полное решение доступно на http://www.mikecousins.com/files/NetworkTest.zip

1 Ответ

1 голос
/ 04 апреля 2012

Это работает для меня.

Вот шаги, которые я сделал с вашим проектом.

  1. Установите определенный порт 59050, так как вы жестко закодировали URL, но используете автоматически назначенный порт.
  2. Добавлен проект Silverlight в WebServer (запуск из Casini лучше, чем запуск из файла.)
  3. Изменен _Layout.cshtml, как показано ниже, для добавления объекта SL

    @ ViewBag.Title NetworkTest html, body { высота: 100%; переполнение: авто; } тело { отступы: 0; поле: 0; } #silverlightControlHost { высота: 100%; выравнивания текста: центр; } function onSilverlightError (sender, args) { var appSource = ""; if (sender! = null && sender! = 0) { appSource = sender.getHost (). Source; }

            var errorType = args.ErrorType;
            var iErrorCode = args.ErrorCode;
    
            if (errorType == "ImageError" || errorType == "MediaError") {
                return;
            }
    
            var errMsg = "Unhandled Error in Silverlight Application " + appSource + "\n";
    
            errMsg += "Code: " + iErrorCode + "    \n";
            errMsg += "Category: " + errorType + "       \n";
            errMsg += "Message: " + args.ErrorMessage + "     \n";
    
            if (errorType == "ParserError") {
                errMsg += "File: " + args.xamlFile + "     \n";
                errMsg += "Line: " + args.lineNumber + "     \n";
                errMsg += "Position: " + args.charPosition + "     \n";
            }
            else if (errorType == "RuntimeError") {
                if (args.lineNumber != 0) {
                    errMsg += "Line: " + args.lineNumber + "     \n";
                    errMsg += "Position: " + args.charPosition + "     \n";
                }
                errMsg += "MethodName: " + args.methodName + "     \n";
            }
    
            throw new Error(errMsg);
        }
    </script>
    

    Мое приложение MVC

    @ Html.Partial ( "_ LogOnPartial")
  4. @Html.ActionLink («Домой», «Индекс», «Домой»)
  5. @Html.ActionLink («О программе», «О программе», «Главная страница»)

4. Проверьте «Silverlight» на вкладке Web, чтобы включить отладку Silverlight. 5. Поместите точку останова в rq.EndGetResponse () (строка 34) в MainPage.xaml.cs. 6. Запустите приложение (Заметьте: эта точка останова попадет в цель.)

Я тестирую с SL5 и IE9.

...