`
gstarwd
  • 浏览: 1527121 次
  • 性别: 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与WCF通信简单例子

    在IT行业中,Silverlight和WCF(Windows Communication Foundation)是两个关键的技术,它们在构建分布式应用程序时发挥着重要作用。本文将深入探讨Silverlight与WCF通信的基础知识,并通过一个简单的应用示例进行...

    如何利用Silverlight与WCF通信

    在实际开发中,WCF服务可能包含更复杂的操作,例如数据传输、事务处理、安全性和错误处理等。同时,Silverlight应用程序可能需要处理各种UI交互、数据绑定和异步编程。理解这些基本概念和技术是构建高效、可扩展的...

    Silverlight启用安全连接与WCF交互

    通过正确配置服务和客户端代理,可以在Silverlight应用中实现与WCF服务的安全通信。在提供的`TransportSecuritySilverlight`示例中,可以找到具体的代码实现和配置方法,这对于深入理解并实践这些概念非常有帮助。

    Silverlight socket通信Dome

    提供的"SocketDemo"很可能是包含一个完整的Silverlight Socket通信示例项目,包含了客户端和服务器端的代码示例,可以用来学习和理解如何在Silverlight应用中实现Socket通信。 总的来说,Silverlight Socket通信...

    silverlight中导入和导出Excel

    在.NET开发领域,Silverlight是...总的来说,Silverlight中导入和导出Excel文件涉及到客户端与服务器之间的数据交互,以及文件操作和数据格式转换。通过WCF服务作为中介,可以实现这个功能,但需注意安全性和性能优化。

    Silverlight-js(SL与JS互相通信实例,说明在xaml.cs文件中)

    在Silverlight中,JavaScript通信主要通过两种方法实现:`ScriptableMember`和`ExternalInterface`。`ScriptableMember`是C#中用于标记公共成员的特性,这样它们就可以在JavaScript中访问。而`ExternalInterface`是...

    Silverlight 3 之通信webclient,webrequest,WCF实例源码

    在Silverlight中,WCF允许创建强类型的服务接口,这些接口可以安全、高效地在客户端和服务器之间交换数据。WCF支持多种传输协议和消息编码,如HTTP、TCP、Named Pipes,以及SOAP、JSON等数据格式。使用WCF时,开发者...

    silverlight 5下载全

    3. **深度安全特性**:Silverlight 5增强了安全特性,如代码访问安全(CAS),使得开发者可以在更安全的环境中运行应用程序。 4. **更丰富的API**:增加了大量新的API,提供了更多的控件和类库,如多媒体播放、数据...

    silverlight4 中文帮助

    安装后,开发人员和用户都能在浏览器中查看和运行基于Silverlight 4的应用程序。 2. **编程模型**:Silverlight 4支持.NET Framework,使用C#、VB.NET或JavaScript进行编程。它引入了新的API和类库,扩展了对RIA...

    Silverlight 2 Toolkit July 2009

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

    silverlight和web页面互相传值

    在提供的`sample`文件中,可能包含了实现这种通信的示例代码,包括Silverlight应用的C#代码和HTML页面的JavaScript代码。通过分析这些代码,可以更深入地理解上述概念。 总之,Silverlight与Web页面的交互是通过`...

    如何在Silverlight控件中与Html元素交互

    在实际应用中,为了实现双向通信,你可能需要在JavaScript和Silverlight之间设置事件监听器。在HTML端,你可以添加事件处理函数来调用Silverlight控件暴露的方法;在Silverlight端,你可以通过`...

    在两个Silverlight应用间数据通信(包括与Flash通信)

    在Silverlight和Flash之间进行数据通信时,通常需要克服浏览器的安全沙箱限制。例如,使用跨域策略文件(crossdomain.xml)允许不同源之间的通信。此外,为了确保数据安全,可能需要加密和解密传输的数据。 总之,...

    silverlight用户验证示例

    本示例“Silverlight用户验证”着重关注如何在Silverlight应用中实现用户输入的验证,确保数据的有效性和安全性。 在Silverlight应用中,用户验证是必不可少的一部分,它能确保用户在提交数据时遵循预设的规则,...

    silverlight 5安装包

    5. **安全增强**:在安全性方面,Silverlight 5增加了对客户端证书的支持,提升了网络通信的安全性。 6. **企业级功能**:Silverlight 5为商业应用提供了更多支持,如Out-of-Browser (OOB)模式,允许应用在浏览器...

    Silverlight和ASP.NET揭秘.rar

    书中可能还涵盖了数据绑定、服务通信(如WCF或RESTful服务)、安全性考虑以及优化技巧。 银光(Silverlight)还包含了丰富的开发工具,如Expression Blend,它为设计人员提供了视觉设计界面,可以与Visual Studio...

    Silverlight与WCF之间的双工通信

    6. **Silverlight客户端代码**: 在Silverlight应用中,我们需要创建一个代理类来与服务通信,并实现回调接口中的方法。使用`ChannelFactory`或者`ServiceReference`生成的服务代理可以方便地进行这些操作。 7. **...

    Silverlight例子

    7. **安全性**: Silverlight运行在沙盒环境中,确保了安全性和隔离性,防止恶意代码对用户的系统造成损害。 **DrPopperSilverlight项目** "DrPopperSilverlight"可能是一个示例项目,用于教授和展示Silverlight的...

    silverlight通过服务连接oracle

    1. **WCF服务**:WCF是.NET Framework中的一个全面的面向服务的架构,它可以提供多种通信协议和绑定方式,如HTTP、TCP等。我们可以创建一个WCF服务项目,定义操作合同(OperationContract),然后在服务实现类中编写...

Global site tag (gtag.js) - Google Analytics