本文是自已在学习silverlight当中遇到的问题及解决方法,记录下来,便于存档。也希望为遇到相同问题的Coder们, 提供一个解决方案的参考。

        一:Silverlight 跨域  

              Silverlight在设计的时候对网络安全方面做了很多考虑,具体可以看Silverlight SDK

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

· Silverlight 跨域策略 (clientaccesspolicy.xml)

· Flash 跨域策略 (crossdomain.xml) 的子集

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

通常,如果基于 Silverlight 的应用程序检测到其请求是一个跨域请求,将首先在 Web 服务的应用程序根处查找 Silverlight 跨域策略文件 (clientaccesspolicy.xml)。如果这个请求导致"404 未找到"或其他错误,应用程序将在应用程序根处查找 Flash 跨域策略文件 (crossdomain.xml)。不允许重定向跨域策略文件。此外,跨域策略文件保持对应用程序会话有效。
   
现在知道了只要在网站中部署一个跨域策略文件,就可以解决Silverlight跨域请求问题。跨域策略文件要放在哪里?

注意:跨域策略文件必须也只能放在网站的放置在根目录下。

          clientaccesspolicy.xml配置:

    <?xml version="1.0" encoding="utf-8"?>

<access-policy>

    <cross-domain-access>

        <policy>

            <allow-from>

                <domain uri="*"/>

            </allow-from>

            <grant-to>

                <resource path="/" include-subpaths="true"/>

            </grant-to>

        </policy>

    </cross-domain-access>

</access-policy>

crossdomain.xml配置:

<?xml version="1.0"?>

<cross-domain-policy>

 <allow-access-from domain="*" />

</cross-domain-policy>

       

        二:Silverlight IIS 部署

     用silverlight开发的程序,部署到IIS 上,会经常弹出“Sys.InvalidOperationException: InitializeError error #2104 in control 'Xaml1': 无法下载 Silverlight 应用程序。请查看 Web 服务器设置”异常。

       出现该异常的原因:silverlight 程序ClientBin目录下的xap xaml 为后缀名的文件不被IIS请求识别。

       解决方法: IIS,添加MIME类型。

MIME 类型
.xaml application/xaml+xml
.xap application/x-silverlight-app

  如仍有问题,请检查IE的配置,放开安全里面的Xaml Active 下载等选项。

 在IIS添加MIME类型,如图所示:

    

    

        三:Silverlight 动态绑定图片

     用Image标签动态绑定异步请求数据时,在每次页面重新加载时,都会出现“Sys.InvalidOperationException: ImageError error #4001 in control 'Xaml1': AG_E_NETWORK_ERROR” 异常。

      Image标签绑定形式如下:

<Image x:Name="rect" Stretch="Fill"  Canvas.Left="150" Canvas.Top="130" Source="{Binding ProductImage}" </Image>

   该异常原因:绑定发生在设置DataContext之前,所以Image路径还没有设置成你期望的值,就进行绑定,所以此时Image标签的source 路径是不可用的。

修改方法码如下:

    xaml中去掉 Source="{Binding ProductImage}"DataContext绑定数据后,再对Image标签设置绑定值。例如:

 <Image x:Name="rect" Stretch="Fill"  Canvas.Left="150" Canvas.Top="130" </Image>

Code

 

posted @ 2009-01-22 09:46 seeker 阅读(4177) 评论(9) 编辑

      学习了TerryLee提供地“一步一步学Silverlight 2系列”后,自已也做了一个DEMO。在此也感谢TerryLee所提供地Silverlight教程。

      但我的例子中,在每次页面重新加载时,都会出现“Sys.InvalidOperationException: ImageError error #4001 in control 'Xaml1': AG_E_NETWORK_ERROR” 异常。也检查了所要加载的图片也是正常的。也借此小标题,跟大家讨论下该问题解决方法。欢迎大家讨论,解决。谢谢!

      源代码: DEMO

posted @ 2008-12-31 11:50 seeker 阅读(360) 评论(3) 编辑

   来源:get与post的区别

 

     1. get是从服务器上获取数据,post是向服务器传送数据。

   2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。 
 
@ HTTP请求:get与psot的区别

HTTP 定义了与服务器交互的不同方法,最基本的方法是get和post。事实上get适用于多数请求,而保留post仅用于更新站点。
根据HTTP规范,get用于信息获取,而且应该是安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,get请求一般不应产 生副作用。幂等的意味着对同一URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。 比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过post请求实现,因为在注解提交之后站点已经不同了(比方说文章下面 出现一条注解)。
在FORM提交的时候,如果不指定Method,则默认为get请求,Form中提交的数据将会附加在url之后,以?分开 与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。get请求请提交的数据放置在HTTP请求协议头中,而post提交的数据则放在实体数据中。
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
 
@ 表单里使用post和get有什么区别
 
在Form里面,可以使用post也可以使用get。它们都是method的合法取值。
但是,post和get方法在使用上至少有两点不同:
1、get方法通过URL请求来传递用户的输入。Post方法通过另外的形式。
2、get方式的提交你需要用Request.QueryString来取得变量的值,而post方式提交时,你必须通过Request.Form来访问提交的内容。

仔细研究下面的代码。你可以运行之来感受一下:

代码
<!--两个Form只有Method属性不同-->
<FORM ACTION="getpost.asp" METHOD="get">
<INPUT TYPE="text" NAME="Text" VALUE="Hello World"></INPUT>
<INPUT TYPE="submit" VALUE="Method=get"></INPUT>
</FORM>
<BR>
<FORM ACTION="getpost.asp" METHOD="post">
<INPUT TYPE="text" NAME="Text” VALUE="Hello World"></INPUT>
<INPUT TYPE="submit" VALUE="Method=Post"></INPUT>
</FORM>

<BR>
<BR>

<% If Request.QueryString("Text") <> "" Then %>
通过get方法传递来的字符串是: "<B><%= Request.QueryString("Text") %></B>"<BR>
<% End If %>

<% If Request.Form("Text") <> "" Then %>
通过Post方法传递来的字符串是: "<B><%= Request.Form("Text") %></B>"<BR>
<% End If %>

说明
把上面的代码保存为getpost.asp,然后运行,首先测试post方法,这时候,浏览器的url并没有什么变化,返回的结果是:
通过Post方法传递来的字符串是: "Hello World"
然后测试用get方法提交,请注意,浏览器的url变成了:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的结果是:
通过get方法传递来的字符串是:"Hello World"
最后再通过post方法提交,浏览器的url还是:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的结果变成:
通过get方法传递来的字符串是: "Hello World"
通过post方法传递来的字符串是: "Hello World"

提示
通过get方法提交数据,可能会带来安全性的问题。比如一个登陆页面。当通过get方法提交数据时,用户名和密码将出现在URL上。如果:
1、登陆页面可以被浏览器缓存;
2、其他人可以访问客户的这台机器。
那么,别人即可以从浏览器的历史记录中,读取到此客户的账号和密码。所以,在某些情况下,get方法会带来严重的安全性问题。
在Form中,建议使用post方法。

posted @ 2008-12-15 08:46 seeker 阅读(298) 评论(0) 编辑
       MSN弹出式消息提示是一直想实现的效果,但苦于不知道如何计算DIV标签在页面上具体位移和搞不清DIV标签层定位原理,导致一直都没有实现MSN弹出式消息提示效果。
       MSN弹出式消息提示效果图(A-01):
      
       前些日子,通过赵玉开发表一篇关于“Js + Css的msn式的popup提示窗口的实现” 文章(原文地址:赵玉开博客)后,给了我实现上的启发,并他实现的基础上拓展新功能:增加最大化窗口和最小化窗口切换。在效果图上可以看到是用“-”号(最小化窗口)表示。 
       闲话不多说了,实现脚本如下:
      
<script language="javascript">
var divTop,divLeft,divWidth,divHeight,docHeight,docWidth,i = 0;
var popupMessage = new Object();
popupMessage.id 
= 'popupMessage';
popupMessage.obj 
= function(){
  
return document.getElementById(popupMessage.id);
}
;
popupMessage.onLoad 
= function(){
    
try{
        divTop 
= parseInt(popupMessage.obj().style.top,10); 
        divLeft 
= parseInt(popupMessage.obj().style.left,10);
        divHeight 
= parseInt(popupMessage.obj().offsetHeight,10);
        divWidth 
= parseInt(popupMessage.obj().offsetWidth,10);
        docWidth 
= document.body.clientWidth;
        docHeight 
= document.body.clientHeight;

        popupMessage.obj().style.top 
= parseInt(document.body.scrollTop,10+ docHeight + 10;
        popupMessage.obj().style.left 
= parseInt(document.body.scrollLeft,10+ docWidth - divWidth;
        popupMessage.obj().style.visibility
="visible";
        popupMessage.timer 
= window.setInterval(popupMessage.move,2);
       
    }

    
catch(e){}
}
;
popupMessage.onResize 
= function(){
    i
+=1;
    
if(i>1000) popupMessage.close();
    
try{
        divHeight 
= parseInt(popupMessage.obj().offsetHeight,10);
        divWidth 
= parseInt(popupMessage.obj().offsetWidth,10);
        docWidth 
= document.body.clientWidth;
        docHeight 
= document.body.clientHeight;
        popupMessage.obj().style.top 
= docHeight - divHeight + parseInt(document.body.scrollTop,10);
        popupMessage.obj().style.left 
= docWidth - divWidth + parseInt(document.body.scrollLeft,10);
    }

    
catch(e){}
}
;
popupMessage.move 
= function(){
    
try
    
{
        
if(parseInt(popupMessage.obj().style.top,10<= (docHeight - divHeight + parseInt(document.body.scrollTop,10)))
        
{
            window.clearInterval(popupMessage.timer);
            popupMessage.timer 
= window.setInterval(popupMessage.onResize,1);
        }

        divTop 
= parseInt(popupMessage.obj().style.top,10);
        popupMessage.obj().style.top 
= divTop - 1;
    }

    
catch(e){}
}
;
popupMessage.close 
= function(){
    
if(popupMessage.obj()) popupMessage.obj().parentNode.removeChild(popupMessage.obj());
    
if(popupMessage.timer) window.clearInterval(popupMessage.timer);
}
;
popupMessage.createInstance 
= function(bodyHtml){
  
try
  
{
    
if(popupMessage.obj())popupMessage.obj().parentNode.removeChild(popupMessage.obj());
    
if(popupMessage.timer) window.clearInterval(popupMessage.timer);   
    i
=0;
    
var odiv = document.createElement('DIV');
    odiv.id 
= popupMessage.id;
    odiv.style.width
="199px";
    odiv.style.height
="auto";
    odiv.style.visibility
="hidden";
    odiv.style.position
="absolute";
    odiv.style.zIndex
="99999";
    odiv.style.left
="0px";
    
    odiv.innerHTML 
= bodyHtml;
    document.body.appendChild(odiv);

  }

  
catch(e){}
}
;

window.onresize 
= popupMessage.onResize;

function popupMessagePopup(bodyHtml)
{
    popupMessage.createInstance(bodyHtml);
    popupMessage.onLoad();
}

 
 popupMessage.convertWin 
= function(){
     
var msg = document.getElementById('msgContent'); 
     
var contentdis = document.getElementById('btContent');
     
var flg = msg.style.display=="none";
     
if(flg)
     
{
          contentdis.innerHTML 
= '';
          contentdis.title
='最小化窗口';      
          msg.style.display 
= "block";
     }

     
else
     
{
          contentdis.innerHTML 
= '';
          contentdis.title
='最大化窗口'
          msg.style.display 
= "none";
     }

 }


function myPopup()
{
  popupMessagePopup(
'<div style="width:199px; height:auto;font-size:12px;border:solid 1px #3399FF;background-color:#CFDEF4; ">'+
     
'<div style="width:199px;height:20px; float:left; ">'+
       
'<span style="width:140px;float:left;text-align:left;text-indent:8px;padding:4px; color:#0C53C5;">消息提示</span>'+
       
'<span title="关闭" style="width:15px;border-width:0px;float:right;margin-right:5px;padding:4px; color:Red; cursor: hand; font-weight:bold;" onclick="popupMessage.close();return false;">×</span>'+
       
'<span id="btContent" title="最小化窗口" style="width:15px;border-width:0px;float:right;padding:4px 4px 4px 4px; margin-right:7px;color:Red;cursor: hand;font-weight:bold;" onclick="popupMessage.convertWin();">—</span>'+
     
'</div>'+
     
'<div id="msgContent" style="width:199px;height:60px; float:left;WORD-BREAK: break-all; padding:8px 8px 8px 8px;border-top:solid 1px #3399FF; text-align:left; text-indent:10px; "><a href="http://seeker.cnblogs.com/" target="_blank" style="font-size:15px; color:Red;">欢迎您访问Seeker博客</a></div>'+
  
'</div>');
}


window.onload 
= myPopup;

</script>

        以上的JS代码,只需要嵌入到HTML文件上,就可以大功告成了。显示效果如A-01图所示。
       引用到学习资源:
         1: 层定位原理
         2: 利用JS来开发属于自己的js对象(createElement对象) 

     有兴趣的朋友,看看能否再改进下该功能,让其支持消息窗口拖动。谢谢大家欢迎访问SEEKER博客。
 
posted @ 2008-02-26 00:21 seeker 阅读(2492) 评论(10) 编辑

      前段时间,在完成FLV视频播放,遭遇一个“在服务器上无法播放FLV视频”问题。奇怪的是在我本机上试验是可以的,当放到服务器上就不行。(程序运行环境:windows 2003 +IIs 6.0

刚开始以为可能是FLV视频文件太大,导致IIS不能下载FLV视频,不能播放。于是修改了IIS附件下载限制,可是到最终在服务器上还是不能播放FLV视频。后来在网络上看到IIS是不支持播放Flash视频,这下可槽糕了,但怎么想也想不通啊,很多视频网站基本上都采用FLASH播放,他们是怎么做到的呢。通过网上资料,最终寻找到ADOBD公司给出“Windows 2003 Server does not stream FLV videos”解决方案:(原文如下:http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_19439&sliceId=1

Please be aware that these steps do not resolve any issue with Flash, but are a configuration step for Microsoft Windows 2003 and Microsoft IIS Server 6.0. Any difficulties in executing these instructions or any errors that may arise from modifying your system settings should be addressed to Microsoft. For more details, please refer to your IIS documentation.

  1. On the Windows 2003 server, open the Internet Information Services Manager.
  2. Expand the Local Computer Server.
  3. Right-click the local computer server and select Properties.
  4. Select the MIME Types tab.
  5. Click New and enter the following information:
    • Associated Extension box: .FLV
    • MIME Type box:flv-application/octet-stream
  6. Click OK.
  7. Restart the World Wide Web Publishing service.

       设置好后,播放器果然可以播放了。到目前为止,可能有人会问,好像跟该文章主题“用编程方式给IIS增加MIME类型”,没有多大关系吧。好,现在就开始进入正题,既然可以手动设置IISMIME类型,那能不能通过程序方式自动给IIS添加MIME类型。那答案是肯定的。只要能获取到IIS控制台的MIME属性就OK了。

 IIS的所有操作都可以由System.DirectoryServices来完成。同样地,MIME也应该是可以的,在MSDN中找到一篇关于“Setting MIME Type Properties Using System.DirectoryServices”文章,原文如下http://msdn2.microsoft.com/en-us/library/ms525901.aspx关键的地方就是引用了Active DS IIS Namespace Provider。这样就得到了IISOLE.IISMimeType类。

具体代码如下:
   

using System;
using System.IO;
using System.DirectoryServices;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Collections;

namespace SettingMIMEType
{
    
class Program
    
{
        
static void Main(string[] args)
        
{

            
string serverName = GetIISPath(args[0]);
            
if (string.IsNullOrEmpty(serverName))
            
{
                Console.WriteLine(
"IIS ServerName is Null");
            }

            
else
            
{
                SetMimeTypeProperty(serverName, args[
1], args[2]);
            }

         
            Console.ReadLine();
        }


        
static string GetIISPath(string siteName) 
        
{
            
string iisPath="IIS://localhost/W3SVC/{0}/Root";
            
string result = string.Empty;
            
int siteID = GetWebSiteID(siteName);
            
if (siteID > 0)
            
{
                result 
= string.Format(iisPath, siteID);
            }

            
else 
            
{
                Console.WriteLine(
"IIS://<servername>/ Is Failed");
            }

            
return result;
        }


        
static int GetWebSiteID(string siteName)
        
{
            DirectoryEntry root 
= new DirectoryEntry("IIS://localhost/W3SVC");
            
foreach (DirectoryEntry dir in root.Children)
            
{
                
if (dir.SchemaClassName == "IIsWebServer")
                
{
                    
string site = dir.Properties["ServerComment"].Value.ToString();
                    
if (site.Equals(siteName, StringComparison.OrdinalIgnoreCase))
                    
{
                        
return int.Parse(dir.Name);
                    }

                }

            }

            
return -1;
        }


        
static void SetMimeTypeProperty(string metabasePath, string newExtension, string newMimeType)
        
{
            Console.WriteLine(
"\nAdding {1}->{2} to the MimeMap property at {0}:",
                metabasePath, newExtension, newMimeType);

            
try
            
{
                DirectoryEntry path 
= new DirectoryEntry(metabasePath);
                PropertyValueCollection propValues 
= path.Properties["MimeMap"];
                Console.WriteLine(
" Old value of MimeMap has {0} elements", propValues.Count);
                
object exists = null;

                
foreach (object value in propValues)
                
{         
                    IISOle.IISMimeType mimetypeObj 
= (IISOle.IISMimeType)value;         
                    Console.WriteLine(
"  {0}->{1}", mimetypeObj.Extension, mimetypeObj.MimeType);
                    
if (newExtension == mimetypeObj.Extension)
                        exists 
= value;
                }


                
if (null != exists)
                
{
                    propValues.Remove(exists);
                    Console.WriteLine(
" Found an entry for {0}; removing it before adding the new one.",
                        newExtension);
                }


                IISOle.MimeMapClass newObj 
= new IISOle.MimeMapClass();
                newObj.Extension 
= newExtension;
                newObj.MimeType 
= newMimeType;
                propValues.Add(newObj);
                path.CommitChanges();
                Console.WriteLine(
" Done.");
            }

            
catch (Exception ex)
            
{
                
if ("HRESULT 0x80005006" == ex.Message)
                    Console.WriteLine(
" Property MimeMap does not exist at {0}", metabasePath);
                
else
                    Console.WriteLine(
"Failed in SetMimeTypeProperty with the following exception: \n{0}",
                        ex.Message);
            }

        }

    }

}


以上代码在WINDWOS2003 + Visual Studio 2008 + IIS 6.0环境中,测试通过。

posted @ 2008-02-12 16:55 seeker 阅读(798) 评论(0) 编辑