Abh*_*Net 6 http amazon-s3 amazon-web-services http-status-code-407 silverlight-5.0
我已经尝试了一切,但我似乎无法解决这个问题,只有一个客户端在公司代理/防火墙后面发生.我们的Silverlight应用程序连接到Amazon S3以下载/上载某些文档.在一个客户端和一个客户端上只返回407错误,之后应用程序无法保存任何内容.
Inner Exception:
System.ServiceModel.ProtocolException: [UnexpectedHttpResponseCode]
Arguments: 407,Proxy Authentication Required
Run Code Online (Sandbox Code Playgroud)
我们在不同的客户端有类似的东西,但有更多的CORS问题.为了解决这个问题,我使用cloud-front伪造了一个子域,然后访问S3存储桶并解决了这个问题.我希望它能解决它与这个客户端,但它没有.
我已经尝试将此代码添加到web.config中,如许多答案所示
<system.net>
<defaultProxy useDefaultCredentials="true" >
</defaultProxy>
</system.net>
Run Code Online (Sandbox Code Playgroud)
我已经阅读了有关使用用户名和密码通过基础身份验证传递代理标头的文章,但我不确定这对我们有何帮助.客户端使用代理服务器,它需要的任何身份验证都在我们的域之外.
**Additional Information**
Run Code Online (Sandbox Code Playgroud)
Silverlight代码引用了2个服务.一个是我们的wcf服务,它检索应用程序的所有数据.一个是使用亚马逊Soap api的Amazon S3服务,其端点位于http://s3.amazonaws.com/doc/2006-03-01/AmazonS3.wsdl?
如果我进入我们的应用程序并且仅使用不对Amazon S3 api进行任何调用的系统的一部分,该应用程序工作正常.一旦我转到调用S3的系统的一部分,问题就开始了.有趣的是,对S3的调用很顺利,我可以检索文档,但是对我们的wcf服务的任何调用都返回407.
有任何想法吗?
**Update 2**
Run Code Online (Sandbox Code Playgroud)
根据Elliot Nelson的评论,我检查了我们用于在我们的应用程序中发出http请求的堆栈.原来我们默认使用http和https请求的客户端http.这是我们在App.xaml构造函数中的代码
public App()
{
Startup += Application_Startup;
UnhandledException += Application_UnhandledException;
InitializeComponent();
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
}
Run Code Online (Sandbox Code Playgroud)
现在,了解clienthttp和browserhttp之间的区别以及何时使用它们.此外,切换到browserhttp的潜在影响/问题.
**Update 3**
Run Code Online (Sandbox Code Playgroud)
有没有办法请求浏览器以受信任模式运行浏览器内的Silverlight应用程序,它是否有助于绕过此问题?
(答案#2)
因此,很可能(对于像此网络这样的企业环境),如果没有在 IE 中设置任何自定义代理设置(通常由企业策略推动),几乎什么也做不了。要利用这些代理设置,您需要使用WebRequestCreator.BrowserHttp
,它在发出请求时自动使用浏览器的默认设置。
Microsoft 文档中提供了这两个客户端之间的差异表。我猜您正在使用BrowserHttp
.
出于安全原因,您无法“询问”浏览器的代理设置是什么并使用它们,因此这是一个棘手的情况。您可以按域指定浏览器与客户端处理,甚至可以针对特定请求指定(上面的同一页面描述了如何操作);在这种情况下,您可以只使用 ClientHttp 进行服务调用,使用 BrowserHttp 进行 S3 调用,从而完全避免问题!
对于接下来的步骤,我会尝试这种方法;如果它不起作用,我会尝试批量切换到 BrowserHttp只是为了看看它是否绕过代理问题(应用程序几乎不可能真正工作,因为您可能正在使用仅 ClientHttp 选项)。
从长远来看,您可能需要考虑对您的服务进行更改,以便它们可由仅 BrowserHttp 的应用程序使用(这需要您对请求/响应非常基础,但仅使用 BrowserHttp 将保证您可以工作几乎在任何公司网络中)。
归档时间: |
|
查看次数: |
1108 次 |
最近记录: |