1

我有一个托管在 ASP 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.错误如下:

{System.ServiceModel.CommunicationException:尝试向 URI 'http://localhost: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。我究竟做错了什么?

4

2 回答 2

1

Silverlight 期望 ClientAccessPolicy.XML 文件在它进行被认为是“跨域”的调用时出现(措辞相当严格)。你设置了吗?我不是 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,从而允许根据请求动态创建策略。

如果您决定采用这种方法,有很多资源可以使用,但我建议您先尝试简单的方法,以确保这是问题所在。

于 2010-10-11T15:38:55.067 回答
0

我对 SilverLight 了解不多,但在谈到部署使用 Azure 存储的 SilverLight 应用程序时,我曾提到过跨域策略。我的 Google foo 很弱,但您可以尝试其中一个链接。

于 2010-10-10T21:49:03.620 回答