2008-10-01 105 views
0

我的应用程序在某些点使用WebRequest从本身获取页面。从本地主机到本地主机的WebRequest:为什么它被拒绝?

这应该不成问题。它实际上在服务器上运行良好,这是一个“中等信任”的“共享”托管软件包。在当地,我使用自定义的安全策略基础上中等信任,其中包括以下—从默认的中等信任策略直接复制:

 
<IPermission 
    class="WebPermission" 
    version="1"> 
    <ConnectAccess> 
     <URI uri="$OriginHost$"/> 
    </ConnectAccess> 
</IPermission> 

出错行是一个自定义XmlRelativeUrlResolver:

public override object GetEntity(System.Uri puriAbsolute, string psRole, System.Type pReturnType) 
{ 
    return _baseResolver.GetEntity(puriAbsolute, psRole, pReturnType); 
} 

被请求的url在本地主机上,在与请求者相同的应用程序中。这是堆栈跟踪的顶部。

 
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) 
    at System.Security.CodeAccessPermission.Demand() 
    at System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint) 
    at System.Net.HttpRequestCreator.Create(Uri Uri) 
    at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase) 
    at System.Net.WebRequest.Create(Uri requestUri) 
    at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials) 
    at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials) 
    at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) 
    at flow.controls.XmlRelativeUrlResolver.GetEntity(Uri puriAbsolute, String psRole, Type pReturnType) in c:\flow\source\controls\DataTransform.cs:line 105 
    at System.Xml.Xsl.Xslt.XsltLoader.CreateReader(Uri uri, XmlResolver xmlResolver)

有人在这里看到问题吗?

@Sijin:谢谢你的建议。发送给解析器的URL基于请求URL,并且我在调试器中确认,在127.0.0.1上访问站点会得到相同的结果。

回答

0

我的无知。我不知道$ OriginHost $令牌被替换为信任级别的originUrl属性—我认为它只是来自应用程序的url。我最初将这个属性留空。

 
<trust level="CustomMedium" originUrl="http://localhost/" /> 
1

如果你把127.0.0.1而不是localhost,它会工作吗?

+0

感谢您的建议。发送给解析器的URL基于请求URL,并且我在调试器中确认,在127.0.0.1上访问站点会得到相同的结果。 – harpo 2008-10-01 15:43:41

0

这可能不是解决办法,但是当我看到你的文章,我想起了这个问题,我大约一年前跑进:

http://support.microsoft.com/default.aspx/kb/896861

会收到401.1错误时,你 浏览使用集成 身份验证的网站,并托管在IIS上 5.1或IIS 6

我们创建了一个WebRequest来屏蔽一个页面,它在我们的生产环境中工作,因为我们没有使用回送主机名,而是在开发机器上我们最终拒绝访问(在应用Windows Server 2003 SP2之后)。这里的一个区别是,这是在集成身份验证下导致它失败的......它在请求是匿名时起作用(所以这就是为什么我不确定这是否是您的答案)。

+0

谢谢。我发现问题如前所述,但我也遇到了类似于你所谈论的问题。 WebRequest不会像请求从浏览器那样通过主持凭据发送;您必须“手动”将它们添加到请求标题中,因为我相信您了解到了这一点。 – harpo 2008-10-01 20:07:54