程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 使用Silverlight的WCF模板問題

使用Silverlight的WCF模板問題

編輯:關於.NET

環境配置:Silverlight 2 tools for visual studio 2008 sp1

VSTS2008 +sp1 

MSSQLSERVER2005

啟用 Silverlight 的 WCF 模板

您可以通過在 Visual Studio? 中創新建一個 WCF 項目來構建可與 Silverlight 應用程序進行通信 的 WCF 服務。

作為創建 WCF 服務的替代方法,您可以在 Visual Studio 中選擇文件項目模板來創建啟用 Silverlight 的 WCF 服務。 顯示的是 Visual Studio 中的新項目模板。據說此模板會自動將綁定設置 為 basicHttpBinding 並添加一些屬性,以使服務與 ASP.NET 兼容。盡管此方法可為您設置正確的綁定 配置,但不要忘記您仍可使用現有的 WCF 服務,但前提是這些綁定是針對 basicHttpBinding 設置的。

只要 Silverlight 應用程序具有 basicHttpBinding 類型的綁定,它就可以調用標准的 WCF 服務。 您必須確保自己可將 WCF 服務的默認綁定從 customBinding 更改為 basicHttpBinding,否則必須新建 一個 basicHttpBinding 類型的綁定。WCF 服務宿主應用程序的 web.config 文件包含用來定義服務配置 的以下 XML。

在我的VS2008英文版中,web.config 為WCF多配置了如下信息;

 <system.serviceModel>
  <behaviors>
   <serviceBehaviors>
    <behavior name="wcf.WCFBehavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <bindings>
    <customBinding>
      <binding name="customBinding0">

      </binding>
    </customBinding>
  </bindings>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
   <service behaviorConfiguration="wcf.WCFBehavior" name="wcf.WCF">
    <endpoint address="" binding="customBinding" bindingConfiguration="customBinding0"
     contract="wcf.WCF" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
   </service>
  </services>
  </system.serviceModel>

不知道是不是英文版的緣故,<customBinding>應該默認是<basicHttpBinding>,在一些 國外的論壇上發現了同樣的問題,

而且,關鍵問題是在客戶端的ServiceReferences.ClientConfig文件中,只有 </configuration>.這樣容易出現“關鍵字不在數據字典中的問題”,這個問題很明顯

OK,那現在來改動一下,因為Silverlight只支持<basicHttpBinding>綁定,所以修改部分代碼 。

首先,web.config文件修改成:

<system.serviceModel>
  <behaviors>
   <serviceBehaviors>
    <behavior name="wcf.WCFBehavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="customBinding0">

      </binding>
    </basicHttpBinding>
  </bindings>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
   <service behaviorConfiguration="wcf.WCFBehavior" name="wcf.WCF">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="customBinding0"
     contract="wcf.WCF" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
   </service>
  </services>
  </system.serviceModel>
</configuration>

其實只是兩個地方要改動,綁定形式

<bindings>
    <basicHttpBinding>
      <binding name="customBinding0">

      </binding>
    </basicHttpBinding>
  </bindings>

,和下面的引用部分。

<endpoint address="" binding="basicHttpBinding" bindingConfiguration="customBinding0">

ServiceReferences.ClientConfig 中添加如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
     <basicHttpBinding>
        <binding name="BasicHttpBinding_WCF" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:2254/WCF.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_WCF" contract="MyData.WCF"
        name="BasicHttpBinding_WCF" />
    </client>
  </system.serviceModel>
</configuration>

保存就可以測試運行了 ,我們在服務接口中寫一個User類來測試

 1using System;
  2using System.Linq;
  3using System.Runtime.Serialization;
  4using System.ServiceModel;
  5using System.ServiceModel.Activation;
  6using System.Collections.Generic;
  7using System.Text;
  8
  9namespace wcf
10{
11    [ServiceContract(Namespace = "")]
12    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
13    public class WCF
14    {
15        [OperationContract]
16        public int CountUsers()
17        {
18            return 2;
19        }
20        [OperationContract]
21        public IEnumerable<User> GetUser()
22        {
23            List<User> list = new List<User>();
24
25               list.Add( new User() { IsMember = false, Name = "qewerl", Age = 34});
26               list.Add(new User() { IsMember = true, Name = "asdful", Age = 23 });
27               list.Add(new User() { IsMember = true, Name = "Paul", Age = 254 });
28              list.Add( new User() { IsMember = false, Name = "John", Age = 64 });
29              return list.AsEnumerable<User>();
30
31        }
32    }
33
34    [DataContract]
35    public class User
36    {
37        [DataMember]
38        public bool IsMember { get; set; }
39
40        [DataMember]
41        public string Name { get; set; }
42
43        [DataMember]
44        public int Age { get; set; }
45    }
46
47}

接下來看客戶端MainPage.xaml.cs。

 1using System;
  2using System.Collections.Generic;
  3using System.Linq;
  4using System.Net;
  5using System.Windows;
  6using System.Windows.Controls;
  7using System.Windows.Documents;
  8using System.Windows.Input;
  9using System.Windows.Media;
10using System.Windows.Media.Animation;
11using System.Windows.Shapes;
12using System.Collections.ObjectModel;
13using SilverlightApplication1.MyData;
14
15namespace SilverlightApplication1
16{
17    public partial class MainPage : UserControl

18    {

19        public MainPage()
20        {
21            InitializeComponent();
22            WCFClient c = new WCFClient();
23
24            c.GetUserAsync();
25            c.GetUserCompleted += (s, e) =>
26            {
27                ObservableCollection<User> p= e.Result;
28                p.ToList<User>();
29
30            };
31        }
32    }
33}
34

其中的ObservableCollection<User> 就可以綁定到DependencyObject的DataSource了;

上面有省略WCF服務的引用過程,至於綁定部分,網上有很多例子,就不再贅述了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved