【问题标题】:ASP.NET MVC to Silverlight CommunicationASP.NET MVC 到 Silverlight 通信
【发布时间】:2012-03-12 12:31:49
【问题描述】:

所以我有一个 ASP.NET MVC Web 应用程序,其中嵌入了一个 silverlight 应用程序,我希望 SL 客户端通过一个启用了 SL 的 WCF 服务与数据库进行通信,该服务在内部运行ASP.NET MVC 应用程序。我没有让这个工作成功,silverlight 应用程序获得了对 WCF 服务的服务引用就好了。当我运行 silverlight 客户端并调用 Web 服务时,它每次都会返回 NOT FOUND 异常。我可以通过调试看到确实调用了 WCF 服务,但是 silverlight 出错并且没有任何东西被传回。

我确实尝试过启用

serviceDebug includeExceptionDetailInFaults="true"

但我仍然得到 NOT FOUND 异常。有什么想法吗?

【问题讨论】:

  • 如果我的方法不正确,请告诉我一个好的选择。

标签: silverlight asp.net-mvc-3


【解决方案1】:

第一个技巧是让您的 silverlight 与您的 WCF 正确通信。 NOT FOUND 发生在许多情况下。可能是您的 Web 服务没有在 IIS 中运行,也可能是您尝试使用某种违反服务合同的对象进行通信。例如。你的对象有一个“对象”类型的属性,它可以是任何东西。缩小此过程的第一步是安装 Fiddler2 以向您显示客户端和服务器之间的网络流量。

一旦完成,即一旦您确定您的 silverlight 应用程序可以与网络服务器通信,那么您可以采取在您的 asp.net 和 silverlight 应用程序之间进行通信的方法。现在,请记住 Silverlight 在客户端上运行,而 asp.net 在服务器上运行,因此,从页面后面的 aspx 代码到 silverlight light 对象的通信必须通过某种通用代理进行 - 该代理是 JavaScript。定义一个 javascript 方法,该方法将访问到 silverlight/object 容器的桥并传递该方法。反之亦然,定义一个允许 silverlight 与 javascript 对话的方法。

例如,假设您有一个以silverlight 显示在您的aspx/html 页面上的类别列表。最有可能的是,该类别列表存在于您的 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);

}

定义 SelectCategory 方法:

[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 对象。

享受吧。

【讨论】:

    【解决方案2】:

    我能够弄清楚这一点 - 我用作数据合同的对象没有被标记为这样,即使它们被 silverlight 应用程序“接受”并且是由服务引用生成的,它们在之后总是会通过这个接受WCF 服务返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多