Мы столкнулись с супер раздражающей проблемой на работе.После того, как наше приложение 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