我有一个以Azure Azure Web角色托管的Silverlight 4应用程序。 Web角色公开WCF服务。 (所有这些都在同一个Visual Studio解决方案中。)
我成功添加了对服务的引用,并生成了客户端代码。但是,它会导致错误:
ExpenseServiceClient service = new ExpenseServiceClient();
service.GetExpensesCompleted += new EventHandler<GetExpensesCompletedEventArgs>(service_GetExpensesCompleted);
service.GetExpensesAsync();
回调:
static void service_GetExpensesCompleted(object sender, GetExpensesCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
return;
}
// ...
}
e.Error如下:
{System.ServiceModel.CommunicationException: 尝试制作时发生错误 对URI的请求 的 'http://本地主机:88 / ExpenseService.svc'。 这可能是由于尝试 以跨域方式访问服务 没有适当的跨域政策 到位,或政策 不适合SOAP服务。你可以 需要联系的所有者 服务以发布跨域 策略文件并确保它允许 要发送的与SOAP相关的HTTP标头。 使用此错误也可能是由此引起的 Web服务中的内部类型 没有使用的代理 InternalsVisibleToAttribute属性。
请查看内部异常 更多细节。
---> System.Security.SecurityException --->
System.Security.SecurityException: Security error.
at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)
--- End of inner exception stack trace ---
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)
--- End of inner exception stack trace ---
at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.ExpenseServiceClientChannel.EndGetExpenses(IAsyncResult result)
at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.ExpenseCalc_SilverLight.ExpenseService.IExpenseService.EndGetExpenses(IAsyncResult result)
at ExpenseCalc_SilverLight.ExpenseService.ExpenseServiceClient.OnEndGetExpenses(IAsyncResult result)
at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)} System.Exception {System.ServiceModel.CommunicationException}
这两个都在localhost
上运行。我做错了什么?
答案 0 :(得分:1)
Silverlight希望ClientAccessPolicy.XML文件在进行被认为是“跨域”的调用时出现(以b / c相当严格的方式)。你准备好了吗?我不是SL专家,但是当策略文件不存在时,通常会出现该错误。
简单的方法是在您网站的根目录创建一个,所以http://localhost/clientaccesspolicy.xml
一个非常松散的“允许所有”文件类似于:
<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers=""*"">
<domain uri=""*""/>
</allow-from>
<grant-to>
<resource path=""/"" include-subpaths=""true""/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
对于更复杂的方案(可能出现在Azure中,具体取决于您的体系结构),您可以创建一个IIS处理程序来提供预期的XML,从而允许根据请求动态创建策略。
如果您决定采用这种方法,这种方法有很多资源,但我建议先尝试简单,以确保问题出现。
答案 1 :(得分:0)