2012-02-22 4 views
1

J'ai donc une application Web ASP.NET MVC dans laquelle une application Silverlight est intégrée et je souhaite que le client SL communique avec la base de données via un service WCF activé par SL qui exécute à l'intérieur l'application ASP.NET MVC. Je n'ai pas eu de chance pour que cela fonctionne, l'application Silverlight obtient une référence de service au service WCF très bien. Lorsque j'exécute le client Silverlight et appelez le service Web, il renvoie une exception NOT FOUND à chaque fois. Je peux voir à travers le débogage que le service WCF est appelé, mais que les erreurs Silverlight sont éliminées et que rien n'est renvoyé.Communication ASP.NET MVC vers Silverlight

Je l'ai essayé permettant

serviceDebug includeExceptionDetailInFaults = "true"

Mais je reçois toujours l'exception INTROUVABLE. Des pensées?

+0

Si mon approche n'est pas correcte alors s'il vous plaît laissez-moi savoir quelle serait une bonne alternative. – jjm340

Répondre

0

J'ai été en mesure de comprendre cela - les objets que j'utilisais comme contrats de données n'étaient pas marqués comme tels et même s'ils étaient "acceptés" par l'application Silverlight et générés par la référence de service après le retour du service WCF.

0

Le premier tour serait d'obtenir votre silverlight pour communiquer correctement avec votre WCF. NOT FOUND se produit sur BEAUCOUP de scénarios. Il se peut que votre service Web ne s'exécute pas dans IIS, il se peut que vous essayiez de communiquer à l'aide d'un objet qui enfreint le contrat de service. Par exemple. Votre objet a une propriété de type "object" qui peut être n'importe quoi. La première étape pour affiner ce processus serait d'installer Fiddler2 pour vous montrer le trafic réseau entre votre client et votre serveur. Une fois cela fait, c'est-à-dire, une fois que vous êtes sûr que votre application Silverlight peut communiquer avec le serveur Web, alors vous pouvez adopter l'approche de communication entre votre application asp.net et votre application SilverLight. Maintenant, gardez à l'esprit que Silverlight s'exécute sur le client, et asp.net s'exécute sur le serveur, par conséquent, communiquer à partir de la page et du code aspx derrière la page vers un objet Silverlight doit passer par un proxy commun - ce proxy étant JavaScript. Définissez une méthode javascript qui accèderait à un pont vers le conteneur silverlight/object et transmettez la méthode. Et vice versa, définissez une méthode qui permettrait à Silverlight de revenir au javascript. Par exemple, supposons que vous ayez une liste de catégories affichée dans silverlight sur votre page aspx/html. Très probablement, cette liste de catégories existe dans un fichier XAP dans votre dossier ClientBin pour votre projet asp.net.
Exemple:

<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> 

Ensuite, dans votre événement chargé pour votre projet Silverlight, inscrivez-vous l'objet comme scriptable:

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)); 
    } 

} 

}

définir la méthode javascript pour parler à une méthode la liste des catégories voir le modèle

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); 

}

Définir la SelectCategory Méthode:

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

Si vous voulez appeler cette méthode d'un autre objet silverlight sur la page:

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

A la fin de tout cela, vous devriez être capable d'utiliser votre balisage html/aspx sur votre page pour invoquer la méthode javascript pour appeler l'objet silverlight.

Profitez-en.