我有一个Silverlight(v3)应用程序,它使用WebRequest向与Silverlight应用程序在同一网站上的网页发出HTTP POST请求.此HTTP请求返回302(重定向)到同一网站上的另一个页面,HttpWebRequest自动应该遵循(根据文档).
发出请求的代码没有什么特别之处(它使用浏览器的HTTP堆栈,它没有配置为使用备用的内置Silverlight HTTP堆栈):
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format("{0}?name={1}&size={2}", _UploadUrl, Uri.EscapeUriString(Name), TotalBytes));
request.Method = "POST";
Run Code Online (Sandbox Code Playgroud)
这一切在Firefox和Chrome中运行良好; Silverlight发出POST HTTP请求,接收302响应并自动执行指定重定向URL的GET HTTP请求并将其返回给我(我知道这是因为我使用Fiddler来监视正在进行的HTTP请求).但是,在Internet Explorer(v8)中,Silverlight执行POST HTTP请求,然后抛出带有404错误代码的WebException!
使用Fiddler,我可以看到Silverlight/Internet Explorer成功返回了请求的302状态代码,我假设我在Silverlight中获得的404状态代码(以及关联的WebException)是因为据我所知HTTP请求由于受到限制,通过浏览器堆栈完成只能返回200或404.真正的问题是为什么Internet Explorer不像其他浏览器那样遵循重定向?
在此先感谢您的帮助!
编辑:我不想使用Silverlight客户端HTTP堆栈,因为根据我的知识,它发出的请求不包括作为浏览器会话一部分的cookie,严格地说包括我需要附加到ASP.NET的身份验证cookie由Silverlight控件发出的HTTP请求.
编辑2:我发现当您执行POST请求时,Internet Explorer仅显示此行为.GET请求成功重定向.考虑到现在有多少网站以Post-Redirect-Get风格执行操作,这似乎是非常糟糕的行为.
我已经创建了一个简单的演示VS2008解决方案,如果它有帮助,它会表现出这种奇怪的行为.它包含一个基本的ASP.NET MVC 1项目和一个Silverlight 3项目.导航到网站上的SilverlightControlTestPage.html页面以查看实际问题.
我一直在努力让WCF安全工作为我的项目工作,并且运气不佳.我正在尝试创建一个使用net.tcp作为绑定的服务,并同时执行消息和传输安全性.使用用户名和密码完成消息安全性,并使用证书完成传输安全性(据称!).
对于我的开发测试,我创建了自己的证书颁发机构,并将此证书放在我的计算机的可信存储(LocalMachine)中.然后,我创建了两个证书,每个证书都由我的证书颁发机构签名,一个用于要使用的服务,另一个用于客户端应用程序.我将这两个放在LocalMachine中的个人商店(我的)中.然后,为了进行测试,我创建了一个未由我的证书颁发机构签名的随机证书(因此不受信任)并将其放在LocalMachine中的个人存储中.我使用makecert来创建这些证书.
然后,我配置连接到服务的客户端应用程序,以使用无效的不受信任的证书作为其客户端证书.设置(假设)服务以使用链信任检查客户端证书.但是,此客户端能够连接并成功与服务通信!它应该被拒绝,因为它的证书是不可信的!
我不知道是什么导致了这种行为,所以我把这个问题提交给你们,看看你们是怎么做的.这是我的WCF配置:
服务配置:
<system.serviceModel>
<services>
<service behaviorConfiguration="DHTestBehaviour" name="DigitallyCreated.DHTest.Business.DHTestBusinessService">
<endpoint address="" binding="netTcpBinding" contract="DigitallyCreated.DHTest.Business.IDHTestBusinessService" bindingConfiguration="DHTestNetTcpBinding" bindingNamespace="http://www.digitallycreated.net/DHTest/v1" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8090/"/>
<add baseAddress="http://localhost:8091/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DHTestBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="DHTestMembershipProvider"/>
<serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName" findValue="CN=business.dhtestDHTest.com" />
<clientCertificate>
<authentication certificateValidationMode="ChainTrust" trustedStoreLocation="LocalMachine" revocationMode="NoCheck" />
</clientCertificate>
</serviceCredentials>
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="DHTestRoleProvider" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="DHTestNetTcpBinding">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName"/>
<transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign"/>
</security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
客户会议:
<system.serviceModel>
<bindings>
<netTcpBinding> …Run Code Online (Sandbox Code Playgroud) 我有一条看起来像这样的路线:
routes.MapRoute(
"BlogTags",
"Blog/Tags/{tag}",
new { controller = "Blog", action = "BrowseTag", viewRss = false }
);
Run Code Online (Sandbox Code Playgroud)
我使用这样的路线创建一个URL:
<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag),
new { action = "BrowseTag", tag = sortedTags[i].Tag })%>
Run Code Online (Sandbox Code Playgroud)
但是,当使用带有#字符的标记(如"C#")时,路由引擎不会将其转义,因此我得到一个如下所示的URL:
<a href="/Blog/Tags/C#">C#</a>
Run Code Online (Sandbox Code Playgroud)
我需要的是#swardped,所以它看起来像这样:
<a href="/Blog/Tags/C%23">C#</a>
Run Code Online (Sandbox Code Playgroud)
我在标签进入路线之前尝试在标签上做一个Url.Encode,如下所示:
<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag),
new { action = "BrowseTag", tag = Url.Encode(sortedTags[i].Tag) })%>
Run Code Online (Sandbox Code Playgroud)
但是这会使路由引擎双重转义#(导致ASP.NET崩溃并出现错误的请求错误)):
<a href="/Blog/Tags/C%2523">C#</a>
Run Code Online (Sandbox Code Playgroud)
我怎样才能让路由引擎正确地为我转义#字符?
提前谢谢你的帮助.