我有一个银光应用程序,它托管在一个包括WCF SOAP Web服务的asp.net web应用程序中。该应用程序在使用SSL时运行在HTTPS://...链接下。当我将其部署在我们运行IIS 7.5的测试服务器上时,一切正常,符合预期。
我还有一个包括RESTful WCF服务的第二个Web应用程序,该服务在我的本地机器和上述测试服务器上均使用SSL运行(但这种情况下没有银光客户端)。
我的问题是,在进行反序列化的部分,银光客户端从SOAP服务获取响应时只在我的本地机器上收到安全性错误。
System.ServiceModel.CommunicationException: 在尝试向URI 'https://localmachinename.domain.com:8000/Service.svc' 发送请求时发生错误。可能由于在没有适当的跨域策略的情况下尝试以跨域方式访问服务,或者策略不适用于SOAP服务所造成。您可能需要联系服务所有者发布一个跨域策略文件,并确保它允许发送与SOAP相关的HTTP头信息。该错误也可能是由于在Web服务代理中使用内部类型而不使用InternalsVisibleToAttribute属性所导致的。请参见内部异常以获取更多详细信息。 ---> System.Security.SecurityException ---> System.Security.SecurityException: 安全出错。 at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.Browser.BrowserHttpWebRequest.c__DisplayClassa.b__9(Object sendState) at System.Net.Browser.AsyncHelper.c__DisplayClass4.b__0(Object sendState) --- 内部异常堆栈跟踪的结尾 --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result) --- 内部异常堆栈跟踪的结尾 --- at System.ServiceModel.Channels.Remoting.RealProxy.Invoke(Object[] args) at proxy_2.EndGetTypes(IAsyncResult ) at NameSpace.ClientClass.ServiceContractInterfaceImplementation.EndGetTypes(IAsyncResult result)
我做错了什么? 部署的应用程序在我们的测试Web服务器上运行良好。
2012年12月6日:问题仍然存在。 一些更新/更多信息:
Web服务使用Windows身份验证和模拟。 测试服务器和本地计算机之间唯一的区别是应用程序池运行在不同的标识下,这两种情况下都是技术域用户。 我发现的唯一区别是本地计算机上的用户未在Active Directory中被授予“信任委派”标志。 所以我认为可能是Kerberos问题。 但是,当我运行我的restful WCF服务和客户端时,这从未是一个问题。 此外,对于SOAP服务使用Windows窗体客户端,在我的本地计算机上一切都很顺利,开发/调试就像预期的那样。
所以这必须是Silverlight的问题。
我不理解的是,假设这个可怕的安全错误是由跨域策略问题引起的,因为在大多数情况下都是如此,那么这些域在哪里交叉? 一切都应该发生在本地计算机上,没有调用其他服务。 这不应该使用IIS Express发生,难道不是吗?
有人能帮忙吗?
我的问题是,在进行反序列化的部分,银光客户端从SOAP服务获取响应时只在我的本地机器上收到安全性错误。
return base.Channel.EndGet...(IAsyncResult) // <-- exception reported here:
System.ServiceModel.CommunicationException: 在尝试向URI 'https://localmachinename.domain.com:8000/Service.svc' 发送请求时发生错误。可能由于在没有适当的跨域策略的情况下尝试以跨域方式访问服务,或者策略不适用于SOAP服务所造成。您可能需要联系服务所有者发布一个跨域策略文件,并确保它允许发送与SOAP相关的HTTP头信息。该错误也可能是由于在Web服务代理中使用内部类型而不使用InternalsVisibleToAttribute属性所导致的。请参见内部异常以获取更多详细信息。 ---> System.Security.SecurityException ---> System.Security.SecurityException: 安全出错。 at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.Browser.BrowserHttpWebRequest.c__DisplayClassa.b__9(Object sendState) at System.Net.Browser.AsyncHelper.c__DisplayClass4.b__0(Object sendState) --- 内部异常堆栈跟踪的结尾 --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result) --- 内部异常堆栈跟踪的结尾 --- at System.ServiceModel.Channels.Remoting.RealProxy.Invoke(Object[] args) at proxy_2.EndGetTypes(IAsyncResult ) at NameSpace.ClientClass.ServiceContractInterfaceImplementation.EndGetTypes(IAsyncResult result)
我的SOAP服务的clientaccesspolicy.xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="*" />
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
我做错了什么? 部署的应用程序在我们的测试Web服务器上运行良好。
2012年12月6日:问题仍然存在。 一些更新/更多信息:
Web服务使用Windows身份验证和模拟。 测试服务器和本地计算机之间唯一的区别是应用程序池运行在不同的标识下,这两种情况下都是技术域用户。 我发现的唯一区别是本地计算机上的用户未在Active Directory中被授予“信任委派”标志。 所以我认为可能是Kerberos问题。 但是,当我运行我的restful WCF服务和客户端时,这从未是一个问题。 此外,对于SOAP服务使用Windows窗体客户端,在我的本地计算机上一切都很顺利,开发/调试就像预期的那样。
所以这必须是Silverlight的问题。
我不理解的是,假设这个可怕的安全错误是由跨域策略问题引起的,因为在大多数情况下都是如此,那么这些域在哪里交叉? 一切都应该发生在本地计算机上,没有调用其他服务。 这不应该使用IIS Express发生,难道不是吗?
有人能帮忙吗?