与Silverlight和WCF服务的CommunicationException

时间:2010-10-10 19:24:27

标签: silverlight wcf azure securityexception

我有一个以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上运行。我做错了什么?

2 个答案:

答案 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)

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