2012-02-22 49 views
1

所以我啓用了嵌入了Silverlight應用程序,我想的SL客戶端通過一個SL數據庫進行通信的ASP.NET MVC的Web應用程序的WCF服務運行裏面的 ASP.NET MVC應用程序。我沒有得到這個工作的運氣,silverlight應用程序獲取WCF服務的服務引用就好了。當我運行Silverlight客戶端並調用Web服務時,它每次都會返回NOT FOUND異常。通過調試,我可以看到WCF服務確實被調用,但Silverlight錯誤已經消失,沒有任何東西被傳回。ASP.NET MVC Silverlight的通信

我曾嘗試使

serviceDebug includeExceptionDetailInFaults = 「真」

但我仍然得到未發現異常。有什麼想法嗎?

+0

如果我的方法不正確,請告訴我一個好的替代方案。 – jjm340 2012-02-22 16:57:24

回答

0

我能夠弄清楚這一點 - 我用作數據合同的對象沒有被標記爲這樣,即使它們被silverlight應用程序「接受」,並且由服務引用生成,它們將始終通過此接受在WCF服務返回之後。

0

第一個竅門是讓你的silverlight與你的WCF正確溝通。 NOT FOUND發生在許多情況下。可能是因爲您的Web服務未在IIS中運行,可能是因爲您嘗試使用某種違反服務合同的對象進行通信。例如。你的對象有一個「對象」類型的屬性,可以是任何東西。縮小這一過程的第一步是安裝Fiddler2,向您顯示客戶端和服務器之間的網絡流量。

一旦做到這一點,即一旦你確定你的Silverlight應用程序可以與Web服務器進行通信,那麼你就可以把你的asp.net和Silverlight應用程序之間進行通信的方法。現在請記住,Silverlight在客戶端上運行,並且asp.net在服務器上運行,因此,從頁面背後的代碼與Silverlight光對象之間的通信必須通過某種常見代理進行 - 代理是JavaScript。定義一個JavaScript方法,該方法將訪問到Silverlight /對象容器的橋接並傳遞該方法。反之亦然,定義一種方法,允許silverlight與javascript進行對話。

例如,假設您的aspx/html頁面上有silverlight中顯示的類別列表。很可能,該類別列表存在於您的asp.net項目的ClientBin文件夾的XAP文件中。
實施例:

<div style="margin:auto; float:left; height:auto;"> 
    <div id="silverlightControlHost_Categoris" style="height:auto;"> 

     <object id="silverlightControl_Categories" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" style="height:100%"> 
     <param name="source" value="ClientBin/Categories.xap"/> 
     <param name="onError" value="onSilverlightError" /> 
     <param name="background" value="white" /> 
     <param name="minRuntimeVersion" value="4.0.50826.0" /> 
     <param name="autoUpgrade" value="true" /> 
     <param name="ScaleMode" value="Stretch" /> 
     <param name="EnableAutoZoom" value="True" /> 
     <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none"> 
      <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/> 
     </a> 
    </object><iframe id="Iframe2" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe> 
    </div> 
</div> 

接着,在對您的Silverlight項目加載的情況下,登記爲編寫腳本的對象:}

using System.Windows.Browser; 

namespace CategoryListing 
{ 
[ScriptableType] 
public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     categoryListing1.DataContext = new MyLibrary.ViewModel.TCategoryListingViewModel(); 
     //categoryListing1 is the name of the control whose data context is the view model 
     HtmlPage.RegisterScriptableObject("categoriesBridge", (categoryListing1.DataContext as MyLibrary.ViewModel.TCategoryListingViewModel)); 
    } 

} 

定義JavaScript方法向一些方法在類別列表查看模式

function selectCategory(category_id) { 
var plugin = document.getElementById("silverlightControl_Categories"); 
//note the reference to the categoriesBridge property that was registered as scriptable 
if (plugin != null) 
    plugin.content.categoriesBridge.SelectCategory(category_id); 

}

定義選擇分類方法:

[ScriptableMember] 
    public void SelectCategory(string category_id) 
    { 
     //select the category here 
    } 

如果你想在頁面上從另一個Silverlight的對象調用此方法:

try 
       { 
        HtmlWindow window = HtmlPage.Window; 
        window.Invoke("SelectCategory", new object[] { "Category1" }); 
       } 
       catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } 

在這一切結束時,你應該能夠在您的頁面上使用您的html/aspx標記來調用javascript方法來調用silverlight對象。

享受。