通过Silverlight访问SharePoint Web服务

时间:2009-02-04 01:31:45

标签: silverlight web-services sharepoint

我在使用Silverlight访问SharePoint Webservice时遇到问题。

  

尝试向URI发出请求时发生错误   'http://sample:8000/_vti_bin/Authentication.asmx'。   这可能是由于尝试   以跨域方式访问服务   没有适当的跨域政策   到位,或政策   不适合SOAP服务。你可以   需要联系的所有者   服务以发布跨域   策略文件并确保它允许   要发送的与SOAP相关的HTTP标头。   请查看内部异常   更多细节。

有些问题:

  1. 如何在Sharepoint Designer上正确部署clientaccesspolicy.xml?只需在设计师中打开网站,添加文件然后发布?
  2. 应部署clientaccesspolicy.xml的站点使用表单身份验证。我无法使用Sharepoint Designer在那里发布。因此,我为此站点创建了新区域,该区域使用Windows身份验证并在那里发布了clientaccesspolicy.xml。两者都使用相同的内容数据库,没有?
  3. 如果将发布clientaccesspolicy.xml,如何允许匿名访问此文件?
  4. 此致 安东卡尔奇克

5 个答案:

答案 0 :(得分:1)

这里回答我的问题1.和2。:

  1. 在Sharepoint Designer中,您可以通过以下方式打开网站:文件 - >开放网站 - >在文本字段“站点名称:”中键入您站点的URL。比拖累删除站点根目录中的clientaccesspolicy.xml。
  2. 如果您有表单身份验证,则不需要此步骤创建新区域(但由于某些原因,它可能很有用)。您只需打开Web浏览器并键入站点的URL即可。然后填写文本字段(始终与具有管理员权限的用户)并选中“自动登录”。之后,Sharepoint设计人员将此凭据用于指定的URL。
  3. 如果你可以帮我提问Nr。 3,或者你有其他解决方案,如何从Silverlight访问clientaccesspolicy.xml,发布它!

答案 1 :(得分:1)

我们在项目中处理此问题的方法是使用HTTP Handler。我们使用一个功能将clientaccesspolicy.xml文件放在_layouts目录(在sharepoint站点之间共享)(您也可以手动将其复制到那里)。

然后我们将HTTP处理程序添加到web.config处理程序部分。在我们的处理程序中,我们检查请求是否是针对/clientaccesspolicy.xml的,如果是,我们重写路径:

if (path.ToLowerInvariant() == "/clientaccesspolicy.xml")
{
    HttpContext.Current.RewritePath("/_layouts/clientaccesspolicy.xml");
}

我不确定这是否会绕过安全性,因此可能无法完全解决您的问题。但至少它为您提供了一种访问此文件的方法。

答案 2 :(得分:0)

  1. 没关系。
  2. 应该是,如果你没有以某种方式设置一个全新的网站。
  3. 不应该是安全风险。如果您需要通过WindowsAuth对服务进行身份验证,那么您应该使用clientaccesspolicy.xml。

答案 3 :(得分:0)

请记住,clientaccesspolicy.xml必须位于域根目录。在您的示例中,它必须来自http://sample:8000/clientaccesspolicy.xml。如果您无法通过该URL在浏览器中打开它,您的Silverlight客户端也无法找到它。

将文件放在正确位置的最简单方法是通过FTP或资源管理器将其复制到那里。该文件应该可供匿名用户使用(当然只读)。

答案 4 :(得分:0)

我找到更多可实现的方法来实现sharepoint httpHandler:它返回clientaccesspolicy.xml自己的所有内容

        public void ProcessRequest(HttpContext context) {
        if (context.Request.Path.ToLowerInvariant() == "/clientaccesspolicy.xml")            {
            context.Response.Write(@"<?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>");
        }
    }