`
gstarwd
  • 浏览: 1488355 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Silverlight 中的 HTTP 通信和安全

阅读更多

Silverlight 中的 HTTP 通信和安全 <script src="../scripts/EventUtilities.js" type="text/javascript"></script><script src="../scripts/SplitScreen.js" type="text/javascript"></script><script src="../scripts/Dropdown.js" type="text/javascript"></script><script src="../scripts/script_manifold.js" type="text/javascript"></script><script src="../scripts/script_feedBack.js" type="text/javascript"></script><script src="../scripts/CheckboxMenu.js" type="text/javascript"></script><script src="../scripts/CommonUtilities.js" type="text/javascript"></script>

Silverlight 中的 HTTP 通信和安全
另请参见   发送反馈意见
 

"折叠"图像 Silverlight 中的 HTTP 功能

在 Silverlight 中,有一些基本的 HTTP/HTTPS 通信功能。 这些功能会根据是使用承载 Silverlight 应用程序的浏览器来执行 HTTP 处理,还是选择使用 Silverlight 客户端来执行 HTTP 处理而有所不同。有关如何为应用程序指定 HTTP 处理的信息,请参见 如何指定浏览器或客户端 HTTP 处理

下面的列表列出了基本 HTTP 功能以及各功能是由浏览器还是客户端 HTTP 处理支持:

功能

HTTP 处理

说明

同域调用

浏览器或客户端

始终允许。

跨域调用

浏览器或客户端

在根据服务器上承载的客户端访问策略文件进行配置时允许。

异步通信

浏览器或客户端

所有调用都是异步的。

标准标头和自定义标头

浏览器或客户端

必须根据客户端访问策略文件来允许。

GET 和 POST 方法

浏览器或客户端

始终允许。

GET 和 POST 以外的方法

仅限客户端

仅对客户端 HTTP 处理允许。

必须根据客户端访问策略文件来允许。

"200 确定"和"400 未找到"状态代码

浏览器或客户端

始终允许。

其他状态代码、响应标头和响应正文

仅限客户端

始终允许。

REST 服务调用

仅限客户端

始终允许。

自动 Cookie 处理

仅限浏览器

始终允许。基于浏览器的 Cookie 存储和基于客户端的 Cookie 存储是分离的,不会进行互操作。

手动访问 Cookie 存储

仅限客户端

始终允许。基于浏览器的 Cookie 存储和基于客户端的 Cookie 存储是分离的,不会进行互操作。

 

"折叠"图像 HTTP 通信方案和建议的方法

Silverlight 支持几种使用 HTTP/HTTPS 的方案。虽然可以使用多种方式和技术执行 HTTP 调用,但是下表描述的是针对这些 HTTP 通信方案的建议方法。这些方法将在本主题后面部分详细讨论。

方案

推荐方法

在同一域中下载和上载资源。

使用 WebClient 类。有关更多信息,请参见按需下载内容

调用在同一域中承载的基于 HTTP 的 Web 服务。

使用 WebClient 类或 HttpWebRequest /HttpWebResponse 类。有关更多信息,请参见How to: Make Requests to HTTP-Based Services

调用在同一域中承载的 SOAP、WCF 或 ASP.NET AJAX Web 服务。

为 Web 服务调用生成的代理。有关更多信息,请参见Accessing Services using Generated Proxies

如果不希望使用代理,请使用 HttpWebRequest /HttpWebResponse 类。

处理 Web 服务中的 XML、JSON 或 RSS 数据。

使用 WebClient 类或 HttpWebRequest /HttpWebResponse 类。有关更多信息,请参见Accessing HTTP Services Directly 如何使用 LINQ to XML 从任意 URI 位置加载 XML 文件

调用另一域中的 Web 服务。

确保客户端访问策略文件位于域的根。使用代理、WebClient 类或 HttpWebRequest /HttpWebResponse 类。有关更多信息,请参见How to: Make a Service Available Across Domain Boundaries

发送 PUT、DELETE 和其他 HTTP 方法,包括自定义方法。

确保客户端访问策略启用了其他 HTTP 方法。指定客户端 HTTP 处理并按正常方式使用 HttpWebRequest /HttpWebResponse 类。有关指定客户端 HTTP 处理的更多信息,请参见如何指定浏览器或客户端 HTTP 处理

对跨域 POST 请求设置请求标头。

确保根据客户端访问策略文件允许标头。

对于数据上载中的请求标头,请使用 WebClient 类。将其 Headers 属性设置为所需的标头集合。

对于其他情况,请使用 HttpWebRequest 类。将其 Headers 属性设置为所需的标头集合。有关允许的标头的列表,请参见 HttpWebRequest. . :: . . Headers

随所有方法发送请求标头。

指定客户端 HTTP 处理并按正常方式使用 HttpWebRequest /HttpWebResponse 类,同时根据需要设置 Headers 属性。

发送对返回错误代码和 SOAP 错误的 SOAP 服务的请求

指定客户端 HTTP 处理并按正常方式使用 HttpWebRequest /HttpWebResponse 类,同时检索报告错误状态的消息正文。有关指定客户端 HTTP 处理的更多信息,请参见如何指定浏览器或客户端 HTTP 处理

"折叠"图像 执行 HTTP 调用的选项

确定应由浏览器还是客户端来执行应用程序的 HTTP 处理后,应在创建任何 Web 请求之前指定该处理。然后可以通过使用客户端代理类或自己构造调用来执行 HTTP 调用。本节介绍执行 HTTP 调用的不同选项。

注意说明:

有关如何为应用程序指定 HTTP 处理的信息,请参见如何指定浏览器或客户端 HTTP 处理

使用代理类

创建 HTTP 请求

如果您希望自己执行 HTTP 调用,可以使用以下在 System.Net 命名空间中找到的类。

  • WebClient

  • HttpWebRequest HttpWebResponse

通过这些类,您可以执行 GET 和 POST 请求并在某些情况下允许使用请求标头。此外,可以配置这些类以在 GET 请求上启用渐进式下载。

WebClient 类

WebClient 类提供了一个基于事件的简单模型,使您可以下载和上载流和字符串。如果不希望使用代理类,那么 WebClient 是个不错的选择。通常,此类易于使用,但为自定义通过网络发送的消息而提供的选项较少。

若要使用 WebClient 执行 POST 请求并上载资源文件或字符串,请使用以下方法之一。

  • WebClient. . :: . . OpenWriteAsync

  • WebClient. . :: . . UploadStringAsync

可以通过设置 WebClient. . :: . . Headers 属性对请求设置标头。必须根据客户端访问策略文件允许请求标头。有关更多信息,请参见本主题中的跨域通信 一节。

下面的代码演示了使用 WebClient 执行 POST 请求的示例。

Visual Basic  "复制"图像 复制代码

    ' Create the web client. 

    Private
 client As
 New
 WebClient()
    Public
 Sub
 New
()
        InitializeComponent()

        ' Associate the web client with a handler for its 

        ' UploadStringCompleted event. 

        AddHandler
 client.UploadStringCompleted, AddressOf
 client_UploadStringCompleted
    End
 Sub




    Private
 Sub
 Button_Click(ByVal
 sender As
 Object
, ByVal
 e As
 RoutedEventArgs)
        ' Create the request. 

        Dim
 postRequest As
 String
 = "<entry xmlns='http://www.w3.org/2005/Atom'>"
 + _
            "<title type='text'>New Restaurant</title>"
 + _
             "<content type='xhtml'>"
 + _
             " <div xmlns='http://www.w3.org/1999/xhtml'>"
 + _
             " <p>There is a new Thai restaurant in town!</p>"
 + _
             " <p>I ate there last night and it was <b>fabulous</b>.</p>"
 + _
             " <p>Make sure and check it out!</p>"
 + _
             " </div>"
 + " </content>"
 + _
             " <author>"
 + _
             " <name>Pilar Ackerman</name>"
 + _
             " <email>packerman@contoso.com</email>"
 + _
             " </author>"
 + _
             "</entry>"


        ' Sent the request to the specified URL. 

        client.UploadStringAsync(New
 Uri("http://blogs.contoso.com/post-create?blogID=1234"
, _
            UriKind.Absolute), postRequest)
    End
 Sub


    ' Event handler for the UploadStringCompleted event. 

    Private
 Sub
 client_UploadStringCompleted(ByVal
 sender As
 Object
, _
         ByVal
 e As
 UploadStringCompletedEventArgs)
        ' Output the response. 

        If
 e.[Error
] IsNot
 Nothing
 Then

            tb1.Text = e.[Error
].Message
            If
 tb1.Text = ""
 Then

                tb1.Text = e.Error
.InnerException.Message
            End
 If



        Else

            tb1.Text = e.Result
        End
 If

    End
 Sub



C#  "复制"图像 复制代码
	// Create the web client.

        WebClient client = new
 WebClient();
        public
 Page()
        {
            InitializeComponent();

	   // Associate the web client with a handler for its

	   // UploadStringCompleted event.

            client.UploadStringCompleted += 
                new
 UploadStringCompletedEventHandler(client_UploadStringCompleted);
        }



        private
 void
 Button_Click(object
 sender, RoutedEventArgs e)
        {
	   // Create the request. 

            string
 postRequest = "<entry xmlns='http://www.w3.org/2005/Atom'>"

            + "<title type='text'>New Restaurant</title>"

            + "<content type='xhtml'>"

            + "  <div xmlns='http://www.w3.org/1999/xhtml'>"

            + "   <p>There is a new Thai restaurant in town!</p>"

            + "   <p>I ate there last night and it was <b>fabulous</b>.</p>"

            + "   <p>Make sure and check it out!</p>"

            + "  </div>"

            + " </content>"

            + " <author>"

            + "   <name>Pilar Ackerman</name>"

            + "  <email>packerman@contoso.com</email>"

            + " </author>"

            + "</entry>"
;

	    // Sent the request to the specified URL.

            client.UploadStringAsync(new
                 Uri("http://blogs.contoso.com/post-create?blogID=1234"
,
                UriKind.Absolute), postRequest); 
        }

        // Event handler for the UploadStringCompleted event.

        void
 client_UploadStringCompleted(object
 sender, 
           UploadStringCompletedEventArgs e)
        {
	    // Output the response. 

            if
 (e.Error != null
)
                tb1.Text = e.Error.Message;
            else

                tb1.Text = e.Result;
        }


若要使用 WebClient 执行 GET 请求来检索字符串或其他资源文件,请使用以下方法之一。

  • WebClient. . :: . . OpenReadAsync

  • WebClient. . :: . . DownloadStringAsync

若要启用 WebClient 的渐进式下载,请将 AllowReadStreamBuffering 属性设置为 false

有关如何使用 WebClient 下载内容的更多信息,请参见按需下载内容

HttpWebRequest 类和 HttpWebResponse 类

HttpWebRequest 类和 HttpWebResponse 类比 WebClient 支持更复杂的通信方案。可以按照 .NET Framework 异步模式使用 HttpWebRequest HttpWebResponse 执行请求。使用 IAsyncResult 可提供异步请求和响应之间的连接。始终对新的非 UI 线程调用 HttpWebRequest 委托,这意味着如果计划在 UI 中使用响应,则需要调用回 UI 线程。可以通过检索当前的 SynchronizationContext 来执行此操作。

下面的代码示例演示了使用 HttpWebRequest HttpWebResponse 类执行调用必须使用的模式。

Visual Basic  "复制"图像 复制代码
    Private
 syncContext As
 SynchronizationContext

    Private
 Sub
 Button_Click(ByVal
 sender As
 Object
, ByVal
 e As
 RoutedEventArgs)
        ' Grab SynchronizationContext while on UI Thread 

        syncContext = SynchronizationContext.Current

        ' Create request 

        Dim
 request As
 HttpWebRequest = _
            TryCast
(WebRequest.Create(New
 Uri("http://blogs.contoso.com/post-create?blogID=1234"
, _
            UriKind.Absolute)), HttpWebRequest)
        request.Method = "POST"



        ' Make async call for request stream.

        ' Callback will be called on a background thread. 

        Dim
 asyncResult As
 IAsyncResult = _
            request.BeginGetRequestStream(New
 AsyncCallback(AddressOf
 RequestStreamCallback), _
            request)

    End
 Sub


    Private
 statusString As
 String


    Private
 Sub
 RequestStreamCallback(ByVal
 ar As
 IAsyncResult)
        Dim
 request As
 HttpWebRequest = TryCast
(ar.AsyncState, HttpWebRequest)
        request.ContentType = "application/atom+xml"

        Dim
 requestStream As
 Stream = request.EndGetRequestStream(ar)
        Dim
 streamWriter As
 New
 StreamWriter(requestStream)

        streamWriter.Write("<entry xmlns='http://www.w3.org/2005/Atom'>"
 + _
            "<title type='text'>New Restaurant</title>"
 + "<content type='xhtml'>"
 + _
            " <div xmlns='http://www.w3.org/1999/xhtml'>"
 + _
            " <p>There is a new Thai restaurant in town!</p>"
 + _
            " <p>I ate there last night and it was <b>fabulous</b>.</p>"
 + _
            " <p>Make sure and check it out!</p>"
 + _
            " </div>"
 + _
            " </content>"
 + _
            "<author>"
 + _
            " <name>Pilar Ackerman</name>"
 + _
            " <email>packerman@contoso.com</email>"
 + _
            " </author>"
 + _
            "</entry>"
)
	
	' Close the stream.

        streamWriter.Close()

        ' Make async call for response. Callback will be called on a background thread. 

        request.BeginGetResponse(New
 AsyncCallback(AddressOf
 ResponseCallback), _
            request)

    End
 Sub

    Private
 Sub
 ResponseCallback(ByVal
 ar As
 IAsyncResult)
        Dim
 request As
 HttpWebRequest = TryCast
(ar.AsyncState, HttpWebRequest)
        Dim
 response As
 WebResponse = Nothing

        Try

            response = request.EndGetResponse(ar)
        Catch
 we As
 WebException
            statusString = we.Status.ToString()
        Catch
 se As
 SecurityException
            statusString = se.Message
            If
 statusString = ""
 Then

                statusString = se.InnerException.Message
            End
 If

        End
 Try


        ' Invoke onto UI thread 

        syncContext.Post(AddressOf
 ExtractResponse, response)
    End
 Sub


    Private
 Sub
 ExtractResponse(ByVal
 state As
 Object
)
        Dim
 response As
 HttpWebResponse = TryCast
(state, HttpWebResponse)

        If
 response IsNot
 Nothing
 AndAlso
 response.StatusCode = HttpStatusCode.OK Then

            Dim
 responseReader As
 New
 StreamReader(response.GetResponseStream())

            tb1.Text = response.StatusCode.ToString() + " Response: "
 _
            + responseReader.ReadToEnd()
        Else

            tb1.Text = "Post failed: "
 + statusString
        End
 If

    End
 Sub


C#  "复制"图像 复制代码
SynchronizationContext syncContext;
private
 void
 Button_Click(object
 sender, RoutedEventArgs e)
{
    // Grab SynchronizationContext while on UI Thread   

    syncContext = SynchronizationContext.Current;

    // Create request   

    HttpWebRequest request =
        WebRequest.Create(new
 Uri("http://blogs.contoso.com/post-create?blogID=1234"
, 
            UriKind.Absolute))
            as
 HttpWebRequest;
    request.Method = "POST"
;


    // Make async call for request stream.  Callback will be called on a background thread.  

    IAsyncResult asyncResult =
        request.BeginGetRequestStream(new
 AsyncCallback(RequestStreamCallback), request);

}
string
 statusString;
private
 void
 RequestStreamCallback(IAsyncResult ar)
{
    HttpWebRequest request = ar.AsyncState as
 HttpWebRequest;
    request.ContentType = "application/atom+xml"
;
    Stream requestStream = request.EndGetRequestStream(ar);
    StreamWriter streamWriter = new
 StreamWriter(requestStream);

    streamWriter.Write("<entry xmlns='http://www.w3.org/2005/Atom'>"

    + "<title type='text'>New Restaurant</title>"

    + "<content type='xhtml'>"

    + "  <div xmlns='http://www.w3.org/1999/xhtml'>"

    + "   <p>There is a new Thai restaurant in town!</p>"

    + "   <p>I ate there last night and it was <b>fabulous</b>.</p>"

    + "   <p>Make sure and check it out!</p>"

    + "  </div>"

    + " </content>"

    + "<author>"

    + "   <name>Pilar Ackerman</name>"

    + "  <email>packerman@contoso.com</email>"

    + " </author>"

    + "</entry>"
);


    // Close the stream.

    streamWriter.Close();

    // Make async call for response.  Callback will be called on a background thread.

    request.BeginGetResponse(new
 AsyncCallback(ResponseCallback), request);

} 
private
 void
 ResponseCallback(IAsyncResult ar)  
{  
    HttpWebRequest request = ar.AsyncState as
 HttpWebRequest;
    WebResponse response = null
;
    try

    {
        response = request.EndGetResponse(ar);
    }
    catch
 (WebException we)
    {
        statusString = we.Status.ToString();
    }
    catch
 (SecurityException se)
    {
        statusString = se.Message;
        if
 (statusString == ""
)
            statusString = se.InnerException.Message;
    }

    // Invoke onto UI thread  

    syncContext.Post(ExtractResponse, response);  
} 

private
 void
 ExtractResponse(object
 state)  
{  
    HttpWebResponse response = state as
 HttpWebResponse;

    if
 (response != null
 && response.StatusCode == HttpStatusCode.OK) 
    {
        StreamReader responseReader = new
 StreamReader(response.GetResponseStream());


        tb1.Text = response.StatusCode.ToString() + 
            " Response: "
  + responseReader.ReadToEnd();
    }
    else

        tb1.Text = "Post failed: "
 + statusString;
}

如果标头是客户端访问策略文件允许的,则可以通过设置 HttpWebRequest. . :: . . Headers 属性发送标头。如果要对除 POST 请求之外的所有通信发送标头,则必须使用客户端 HTTP 处理。有关更多信息,请参见本主题中的跨域通信 一节。

若要启用 HttpWebRequest 的渐进式下载,请将 AllowReadStreamBuffering 属性设置为 false 。然后可以在响应流上对 BeginRead 执行多个调用。

  • 有关如何使用 HttpWebRequest HttpWebResponse 与 Web 服务通信的更多信息,请参见How to: Make Requests to HTTP-Based Services

"折叠"图像 跨域通信

默认情况下,Silverlight 支持在同域或源站点上调用 Web 服务。同域意味着调用必须使用同一子域、协议和端口。这是出于安全原因以及防止跨域伪造。

下图演示了在使用默认设置的 Silverlight 应用程序中所允许和不允许的调用示例。

 

 


Silverlight 默认网络限制

使用跨域策略文件启用跨域通信

通过在域的根部署使用正确跨域策略文件的 Web 服务,可以在其他域中启用 Silverlight 应用程序要调用的 Web 服务。Silverlight 支持两种类型的跨域策略文件。

下图演示一个使用客户端访问策略文件的跨域通信示例。


Silverlight 跨域策略

通常,如果 Silverlight 应用程序检测到其请求是一个跨域请求,它将首先在 Web 服务的应用程序根处查找 Silverlight 客户端访问策略文件 (clientaccesspolicy.xml)。如果这个请求导致"404 未找到"或其他错误,应用程序将在应用程序根处查找 Adobe Flash 跨域策略文件 (crossdomain.xml)。不允许重定向跨域策略文件。此外,对每个应用程序会话只请求一次跨域策略文件。

下表列出了请求统一资源定位符 (URI) 和 Silverlight 应用程序将查找跨域策略文件的位置的示例。

请求 URI

跨域策略文件位置

http://contoso.com/services/data

http://contoso.com/clientaccesspolicy.xml

http://sales.contoso.com/services/data

http://sales.contoso.com/clientaccesspolicy.xml

http://contoso.com:8080/services/data

http://contoso.com:8080/clientaccesspolicy.xml

https://contoso.com/services/data

https://contoso.com/clientaccesspolicy.com

如前所述,不允许重定向跨域策略文件。但是,Silverlight 应用程序将执行目标资源的重定向。仅当以下文件授予访问权限时才可检索该资源:

向 Silverlight 跨域调用方公开 Web 服务的安全注意事项

允许 Silverlight 客户端在跨域情况下访问 Web 服务之前,有一些重要的安全注意事项。只要放置好客户端访问策略文件,就应将承载 Web 服务的 Web 服务器配置为禁用浏览器缓存。这使您能够轻松更新文件或在必要时限制对 Web 服务的访问。一旦选中了客户端访问策略文件,它就保持对浏览器会话有效,这样可使非缓存对最终用户的影响降至最小。 

此外,所有 Silverlight 请求发送时都带有 cookie 和身份验证。这意味着如果您有允许用户访问私有信息的 Web 服务,则应在另一个域上承载这些 Web 服务,而不是将这些服务向第三方调用方公开。例如,试想您有一个承载于 http://www.tailspintoys.com 的 Web 存储区。该站点允许客户存储包括信用卡号在内的帐单信息。您不应将返回产品清单的 Web 服务向同一域中的第三方 Silverlight 客户端公开。由于 cookie 和身份验证随每个消息发送,如果将这些 Web 服务承载于同一域上,则实际上给予了第三方调用方访问客户私有帐单信息的权限。在此示例中,公开的 Web 服务能够安全地承载于 http://services.tailspintoys.com,因为这是一个不同的域。您必须认真考虑向谁公开了 Web 服务,以及还有哪些其他 Web 服务位于此域。此外,应始终使客户端访问策略文件尽可能严格一些。有关公开安全 Web 服务的更多信息,请参见Security Considerations for Service Access Making a Service Available Across Domain Boundaries

客户端访问策略文件示例

Silverlight 跨域策略文件中的通配符

Silverlight 客户端访问策略文件 (clientaccesspolicy.xml) 可以包含通配符 (*)。通配符可用于将对服务的访问权限授予所有域,但通常应将跨域访问权限仅授予您所知将需要访问权限的最小域集。此外,使用通配符的方式会影响 HTTP 和 HTTPS 之间的通信或者跨方案、调用方以及服务。

下表列出域节点的可能值以及每个值在跨方案访问中的影响。

URI

HTTPS

HTTP

<domain uri = "*">

启用所有 HTTPS 调用方

启用所有 HTTP 和 HTTPS 调用方

<domain uri= "http://*">

启用所有 HTTP 调用方

启用所有 HTTP 调用方

<domain uri = "http://www.contoso.com" >

仅来自 http://www.contoso.com 的调用方

仅来自 http://www.contoso.com 的调用方

<domain uri = https://www.contoso.com >

仅来自 https://www.contoso.com 的调用方

仅来自 https://www.contoso.com 的调用方

此外,对于客户端访问策略文件的 <AllowFrom> 节,也可以使用通配符启用来自该节中特定子域的调用方。下面的示例演示 Silverlight 客户端访问策略文件的摘录,其中使用通配符来启用来自一个子域的请求。

  "复制"图像 复制代码
<?xml version="1.0" encoding="utf-8"?>
  <access-policy>
    <cross-domain-access>
      <policy >
        <allow-from http-request-headers="SOAPAction">
          <domain uri="http://*.tailspintoys.com"/>
        </allow-from>
...

跨域请求的方法支持

可以使用客户端 HTTP 处理为 Silverlight 应用程序启用其他 HTTP 方法。具体方法是将 http-methods 特性设置为通配符 (*)。如果 Silverlight 应用程序使用的是浏览器 HTTP 处理,则仅启用 GET 和 POST,而不管客户端访问策略文件中的设置。出于安全原因,一些方法会受到限制。

  "复制"图像 复制代码
<?xml version="1.0" encoding="utf-8"?>
  <access-policy>
    <cross-domain-access>
      <policy >
        <allow-from http-methods="*">
          <domain uri="http://*.tailspintoys.com"/>
        </allow-from>
...

跨域请求的标头支持

如果使用浏览器 HTTP 处理,则仅当在客户端访问策略文件中显式允许时,才对跨域 POST 请求允许请求标头。客户端 HTTP 处理则在客户端访问策略文件中允许时,对所有 HTTP 方法启用请求标头。此规则的一个例外是 Content-Type 标头。跨域 POST 请求始终允许有 Content-Type 标头,不需要在客户端访问策略文件中显式调用这类标头。您还可以启用其他标头,方法是将 http-request-headers 设置为以下值之一:

  • 如客户端访问策略文件示例所示的单个标头类型 (SOAPAction )

  • 逗号分隔的标头列表 (SOAPAction, x-custom-header )

  • 启用所有标头的通配符 (* )

下表概括了客户端访问请求的标头支持。

HTTP 方法

同域调用

跨域调用

GET

始终允许标头

从不允许请求标头

POST

始终允许标头

根据客户端访问策略文件允许请求标头

其他方法

始终允许标头

仅限客户端 HTTP 处理。必须根据客户端访问策略文件来允许。

跨域请求的路径限制

除了需要客户端访问策略文件外,如果不允许所有路径和子路径,则对于可由 Silverlight 应用程序调用的跨域 URI 的路径部分中允许的字符,还有其他限制。下图显示了 URI 的路径部分。

URI 的路径部分

URI 路径

客户端访问策略文件限制路径时,下面的字符从不允许出现在跨域请求路径中。

  • 连续点字符 (..)

  • 后带正斜杠的点 (./)

  • 百分号 (%)

有关启用的客户端访问策略文件和方案的格式的更多信息,请参见 Silverlight 中的网络安全访问限制 Making a Service Available Across Domain Boundaries

Adobe Flash 跨域策略文件

Silverlight 支持 Adobe Flash 跨域策略文件(名为 crossdomain.xml)的子集。Silverlight 支持 <allow-access-from> 标记具有以下特性。

  • domain 特性。此特性允许的唯一值为 "*" ,这意味着向所有调用方公开整个域。

  • secure 特性。此特性仅在目标域为 HTTPS 时才有意义。此特性接受 true false 值,它指示是否允许 HTTP 调用方访问此域中的资源。

  • headers 特性。此特性列出接受的标头。

  • 下面是 Silverlight 支持的 Adobe Flash 跨域策略文件 (crossdomain.xml) 的一个示例。

  "复制"图像 复制代码
<?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM
     "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
       <allow-access-from domain="*"/ headers="SOAPAction" 
         secure="true">
    </cross-domain-policy>
分享到:
评论

相关推荐

    Silverlight 2 Toolkit July 2009

    Microsoft Silverlight 是一个跨浏览器、跨平台的 .NET Framework 实现,用于获得 Web 的媒体体验和丰富交互式应用程序。以下各节说明如何使用 Silverlight 生成应用程序: Silverlight 的 .NET Framework 类库 ...

    silverlight4.0中文教程二(一共两个分卷压缩包下载全了再解压)

    请注意:由于文件过大分卷压缩,一共两个压缩包(),请下载后放在同一目录下再解压缩,只下载其中一个无法使用,这是第二个分卷压缩包,重名还不...网络和通信 调试、错误处理和异常 部署和本地化 性能 安全性 常规参考

    Silverlight3中文开发文档[4]

    详尽的Silverlight3中文教程 目录: +Silverlight 的 .NET Framework 类库 +Silverlight 概述 +入门 +应用程序和编程模型 ...+网络和通信 +调试、错误处理和异常 +部署和本地化 +性能 +安全性 +常规规参考

    Silverlight 参考手册 (全) [微软官方 MSDN] (chm格式,共2卷,2-1)

    Silverlight 参考手册 (全) [微软官方 MSDN] MSDN Library - Silverlight 制作成了chm格式,方便离线状态下...网络和通信 调试、错误处理和异常 部署和本地化 性能 安全性 Mobile Platform Development 常规参考 ……

    silverlight4.0中文教程一(一共两个分卷压缩包下载全了再解压)

    请注意:由于文件过大分卷压缩,一共两个压缩包,请下载后放在同一目录下再解压缩,只下载其中一个无法使用 Microsoft Silverlight 是一种跨...网络和通信 调试、错误处理和异常 部署和本地化 性能 安全性 常规参考

    Silverlight 参考手册 (全) [微软官方 MSDN] (chm格式,共2卷,2-2)

    Silverlight 参考手册 (全) [微软官方 MSDN] MSDN Library - Silverlight 制作成了chm格式,方便离线状态下...网络和通信 调试、错误处理和异常 部署和本地化 性能 安全性 Mobile Platform Development 常规参考 ……

    Silverlight3中文开发文档[3]

    详尽的Silverlight3中文教程 目录: +Silverlight 的 .NET Framework 类库 +Silverlight 概述 +入门 +应用程序和编程模型 ...+网络和通信 +调试、错误处理和异常 +部署和本地化 +性能 +安全性 +常规规参考

    Silverlight3中文开发文档[1]

    详尽的Silverlight3中文教程 目录: +Silverlight 的 .NET Framework 类库 +Silverlight 概述 +入门 +应用程序和编程模型 ...+网络和通信 +调试、错误处理和异常 +部署和本地化 +性能 +安全性 +常规规参考

    Silverlight3中文开发文档[2]

    详尽的Silverlight3中文教程 目录: +Silverlight 的 .NET Framework 类库 +Silverlight 概述 +入门 +应用程序和编程模型 ...+网络和通信 +调试、错误处理和异常 +部署和本地化 +性能 +安全性 +常规规参考

    Silverlight3中文开发文档[5]

    详尽的Silverlight3中文教程 目录: +Silverlight 的 .NET Framework 类库 +Silverlight 概述 +入门 +应用程序和编程模型 ...+网络和通信 +调试、错误处理和异常 +部署和本地化 +性能 +安全性 +常规规参考

    Csharp.2008编程参考手册.part1.rar

    C#2008与.NET Framework 3.5提供了许多新的引以为豪的功能,从而... ◆使用Silverlight 1.0和silverlight 2构建RIA应用程序的方式  本书读者对象:本书适合于正在寻求全面介绍C#语言的具有不同开发经验的C#开发人员。

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    1.5.5 在visual studio 2010中记录和使用宏 55 1.5.6 类图 57 1.5.7 应用程序生命周期管理 58 1.5.8 性能工具 60 1.6 小结 62 第2章 对象和visual basic 63 2.1 面向对象的术语 64 2.1.1 对象、类和...

    MSDN杂志 2008年新产品特刊

    &lt;br&gt;超酷代码: Silverlight 技巧、窍门和最佳实践 Jeff Prosise 为 Silverlight 开发提供了非常有帮助的技巧,虽然它们已经被广为应用,但仍需要更多的文档和最佳实践,以便开发人员能最大限度地利用这些令人...

    Адаптер Рутокен Web Плагин-crx插件

    仅使用内置的API内置于浏览器中,并且不需要安装其他组件,框架和平台,例如Java,Microsoft Silverlight和其他组件。适用于MS Windows平台上的所有着名浏览器,Apple OS X,GNU / Linux。服务器部件 - 在服务器上...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Chrome Frame 会把最新版的Chrome Webkit 内核和JavaScript 引擎注入到IE中, IE浏览器将获得Chrome的性能和功能 目录 摘要 I ABSTRACT II 专业名词清单 III 第一章 绪论 1 1.1 研究背景与意义 1 1.2国内外相关...

Global site tag (gtag.js) - Google Analytics