小编Dan*_*ers的帖子

HttpWebRequest仅在Internet Explorer中返回404s的404s

我有一个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页面以查看实际问题.

.net c# silverlight internet-explorer httpwebrequest

8
推荐指数
1
解决办法
2067
查看次数

使用证书的WCF传输安全性忽略了链信任

我一直在努力让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)

.net c# security wcf certificate

6
推荐指数
1
解决办法
6434
查看次数

让ASP.NET MVC正确地转义路由中的#(hash/pound)字符

我有一条看起来像这样的路线:

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)

我怎样才能让路由引擎正确地为我转义#字符?

提前谢谢你的帮助.

c# asp.net-mvc url-routing

6
推荐指数
1
解决办法
3543
查看次数