locked
webclient和wcf的问题 RRS feed

  • 问题

  • 不太理解webclient到底如何使用? 为什么在本地调试没有问题一发布到iis就不会刷新了. 然后我又想用wcf来做结果出现什么跨域调用的问题.配置如下
    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_getxml" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://服务器IP:1979/getxml.svc" binding="basicHttpBinding"
                    bindingConfiguration="BasicHttpBinding_getxml" contract="ServiceReference1.getxml"
                    name="BasicHttpBinding_getxml" />
            </client>
        </system.serviceModel>
    </configuration>

    我用webclient获取一个xml文件然后从中取数据.然后实时刷新到控件中.代码如下.
    1 public partial class TestDatagrid : UserControl  
    2     {  
    3         public TestDatagrid()  
    4         {  
    5             InitializeComponent();  
    6             listpeople = new ObservableCollection<people>();  
    7             DispatcherTimer timer = new DispatcherTimer();  
    8             timer.Interval = TimeSpan.FromSeconds(2);  
    9             timer.Tick += new EventHandler(timer_Tick);  
    10             timer.Start();  
    11         }  
    12  
    13         void timer_Tick(object sender, EventArgs e)  
    14         {  
    15             //定时读取文件  
    16             WebClient webclient = new WebClient();  
    17             webclient.OpenReadCompleted += new OpenReadCompletedEventHandler(webclient_OpenReadCompleted);  
    18             webclient.OpenReadAsync(new Uri("ITMS.xml", UriKind.Relative));  
    19               
    20         }  
    21  
    22         void webclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)  
    23         {  
    24             //读取完毕之后筛选值  
    25             XElement xml = XElement.Load(System.Xml.XmlReader.Create(e.Result));  
    26             var query = from x in xml.DescendantsAndSelf("people")  
    27                         select new people  
    28                         {  
    29                             name = x.Attribute("name").Value,  
    30                             value = x.Attribute("value").Value,  
    31                         };  
    32  
    33             ObservableCollection<people> ops = new ObservableCollection<people>();  
    34             foreach (people p in query.ToList())  
    35             {  
    36                 listpeople.Add(p);  
    37             }  
    38         }  
    39         ObservableCollection<people> listpeople;  
    40         //动态创建的datagrid  
    41         private void createDatagrid_Click(object sender, RoutedEventArgs e)  
    42         {  
    43             DataGrid dg = new DataGrid();  
    44             DataGridTextColumn namecol = new DataGridTextColumn();  
    45             namecol.Header = "姓名";  
    46             namecol.Binding = new System.Windows.Data.Binding("name");  
    47             DataGridTextColumn agecol = new DataGridTextColumn();  
    48             agecol.Header = "年龄";  
    49             agecol.Binding = new System.Windows.Data.Binding("value");  
    50             dg.AutoGenerateColumns = false;  
    51             dg.Columns.Add(namecol);  
    52             dg.Columns.Add(agecol);  
    53  
    54             listpeople = new ObservableCollection<people>(){new people { name = "Mick", value = "24" },  
    55             new people { name = "jack", value = "20" },  
    56             new people { name = "tom", value = "29" }};  
    57             dg.ItemsSource = listpeople;  
    58             datagridcontainer.Children.Add(dg);  
    59  
    60         }  
    61     }  
    62     public class people  
    63     {  
    64         public string name { getset; }  
    65         public string value { getset; }  
    66     } 
    2009年2月26日 15:17

答案

  • wcf 发布到IIS上面,一般要配置跨域策略才可以访问,把跨域文件放在你网站的根目录下

    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> 

     

    可以参考

    http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx

    • 已标记为答案 worldman 2009年3月3日 10:25
    2009年2月27日 2:29

全部回复

  • wcf 发布到IIS上面,一般要配置跨域策略才可以访问,把跨域文件放在你网站的根目录下

    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> 

     

    可以参考

    http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx

    • 已标记为答案 worldman 2009年3月3日 10:25
    2009年2月27日 2:29
  • 不好意思.近段时间没上.


    我是按照以上的步骤发布的.! 可是还是出现这样的问题.


    如果我用webclient的话. 就是不刷新..      难道是我理解错误.

     
    按照代码里面那样.在客户端做一个定时器,然后每隔一段时间获取服务器上的文件.这样有问题吗?
    2009年3月1日 9:13
  • 定义一个变量
    public bool isread=false

    if(isread)
    {
    .....
    }


    OpenRead()
    {
    isread = true
    }

    OpenReadCompleted()
    {
    isread = false
    }
    你如果正在读取这个文件,你的Timer又读取了就会出现错误,定义一个开关就行了
    2009年3月1日 11:35
  •  出错倒是没有..就是经常没有刷新.!   现在确定了这样的实现方式是可行的就好了. 谢谢.!



       看来似乎我要对silverlight.整个技术 理一理了.!


    问题总是很多...呵呵
    2009年3月1日 14:17