有没有什么好的工具可以将GWT与ASP.Net集成?

时间:2009-05-19 21:56:29

标签: c# asp.net gwt

是否有任何好的工具可用于将GWT(Google Web Toolkit)与ASP.Net服务器应用程序一起使用? GWT的编程模型和工具非常好,但是如果后端可以保留在C#/ ASP.Net中则会很好。

目前是否有适合的解决方案?

8 个答案:

答案 0 :(得分:24)

我正在开发一个GWT项目,其中ASP.NET是我在服务器上的唯一选择。我发现,虽然它需要一些额外的工作,JavaScript Overlay类型可以使它变得容易。无论您的服务器使用什么技术,只要它可以使用JSON序列化数据进行响应。例如,如果您在C#中有一个Contact类:

public class Contact 
{
  public int Id { get; set; }
  public string LastName { get; set; }
  public string FirstName { get; set; }
  public string Email { get; set; }
}

设计您的服务器,使其返回序列化为JSON。我使用ASP.NET MVC是因为它需要很少的工作。这是一个非常简单的例子,我们假设Contact有一个静态方法,给定一个id,它将返回一个Contact实例:

public class ContactController : Controller 
{
  public ActionResult GetContact (int id) 
  {
    return Json(Contact.GetById(id), JsonRequestBehavior.AllowGet);
  }
}

现在,在您的GWT应用程序中,为您的联系人创建一个JavaScript覆盖类型:

import com.google.gwt.core.client.JavaScriptObject;

public class Contact extends JavaScriptObject {
  protected Contact() { }

  public final native int getContactId() /*-{ return this.Id; }-*/;
  public final native String getLastName() /*-{ return this.LastName; }-*/;
  public final native String getFirstName() /*-{ return this.FirstName; }-*/;
  public final native String getEmail() /*-{ return this.Email; }-*/;

  public static final native Contact createFromJson(String json) /*-{
    return eval('(' + json + ')');
  }-*/;
}

接下来,在您的GWT项目中,使用HTTP请求与服务器通信:

public class ContactLoader {
  private int id; 

  public ContactLoader(int id) {
    this.id = id;
  }

  public void beginLoad() {
    String url = "/YourService/GetContact/?id=" + id;
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
    try {
      @SuppressWarnings("unused")
      builder.sendRequest(null, new RequestCallback() {
        @Override
        public void onResponseReceived(Request req, Response resp) {
          Contact contact = Contact.createFromJson(req.getText());
          // do something with your contact.  In my project, I
          // fire an event here for which the contact is the payload
        }

        @Override
        public void onError(Request request, Throwable exception) {
          // handle your error
        }
    catch (Exception exception) {
      // handle your error
    }
  }
}

也可以使用具有覆盖类型的泛型类型。例如,我从不返回一个裸对象,我总是使用通用容器进行传输,这样我就可以轻松处理客户端的错误报告。

C#:

public class ServerResponse<T> 
{
  public T Payload { get; set; }
  public bool Success { get; set; }
  public String Message { get; set; }
}

爪哇:

public class ServerResponse<T extends JavascriptObject> 
  extends JavaScriptObject {
  protected ServerResponse() { }

  public final native T getPayload() /*-{ return this.Payload; }-*/;
  public final native boolean getSuccess() /*-{ return this.Success; }-*/;
  public final native String getMessage() /*-{ return this.Message; }-*/;
}

这让我可以返回我的联系人,一组联系人或其他什么。它还有助于减少数据加载逻辑中的重复。

这是一个非常简单的示例,但希望它足以为任何需要非Java后端帮助的人清除路径。我发现有助于讨论叠加类型的另一个资源是Matt Raible的“JSON Parsing with JavaScript Overlay Types in GWT”。

答案 1 :(得分:7)

根据GWT FAQ,您应该可以这样做。

  

AJAX的核心是从浏览器中运行的JavaScript应用程序对服务器进行数据读/写调用。 GWT是“RPC不可知的”,对于用于发出RPC请求的协议,甚至服务器代码编写的语言都没有特别的要求。虽然GWT提供了一个类库,使得与J2EE服务器的RPC通信非常容易,您不需要使用它们。相反,您可以构建自定义HTTP请求以检索,例如,JSON或XML格式的数据。

我不知道有任何简化对象序列化/反序列化逻辑的项目,如果那是你的问题。

客户端GWT代码被编译为javascript,因此用于服务它的服务器并不重要。

答案 2 :(得分:2)

我一直在寻找同样的东西 - 我发现了类似于GWT对ASP.Net所做的类似于Script#的东西。它是由主要负责ASP.NET AJAX的同一个人编写的 - Nikhil Kothari。该网站是:http://projects.nikhilk.net/ScriptSharp

它基本上需要C#代码并将其编译为Javascript - 与GWT相同(只有它用Java做)

老实说,我认为GWT可以与ASP.NET甚至ASP.NET MVC一起工作 - 我认为你需要JSON或XML在ASP.NET中提供通用处理程序(.ashx)才能使用GWT。我自己没试过..

如果我困惑任何人,请原谅我。

答案 3 :(得分:2)

查看Smart GWT库 - 它的数据绑定层可以直接调用SOAP Web服务(标准.asmx)。

答案 4 :(得分:2)

有人在阅读这个问题:请忽略已接受的答案。这完全是错的。 OP希望将GWT与ASP.Net后端一起使用,他不想使用ASP.Net生成GWT。任何可以生成JSON / JSONP的后端语言都可以通过Javascript叠加快速与GWT集成。

答案 5 :(得分:1)

尝试SharpKit,它允许您使用C#编写,并在编译期间转换为JavaScript。它还可用作命令行可执行文件。它支持许多流行的Web库,如jQuery,它还支持完整的C#4语言语法和.NET 4.0。

答案 6 :(得分:0)

如果您使用的是SmartGWT,它包含一个RestDataSource,它提供了可以在.NET中实现的预构建的JSON或XML协议。我们公共wiki的这一系列文章展示了如何为RestDataSource构建ASP.NET MVC后端,该后端实现了所有4个CRUD操作,数据库事务和对SmartGWT AdvancedCriteria的支持(使用NHibernate):

http://wiki.smartclient.com/display/Main/Integrating+with+ASP.Net+MVC

在这种特殊情况下,使用SmartClient而不是SmartGWT,但所有后端代码都是相同的(SmartGWT只为SmartClient提供GWT支持;它是引擎盖下的相同代码)。前端代码很简单,很容易转换为SmartGWT。

wiki上的这段代码都是免费的,构建前端所需的SmartGWT编辑也是免费的(它是LGPL下的开源代码)。

答案 7 :(得分:0)

smcmahon的回答真正帮助我的公司实现了这一目标,现在我们定期这样做 - 使用GWT开发前端,使用.NET / MS技术开发后端。

我一生都是MS开发人员 - 最新的带有.net后端的Silverlight前端。它花了大约一个月的工作但最后我们使用Visual Studio 2010中开发的.NET后端/ Web服务实现了在Eclipse中开发单页GWT应用程序的流畅过程。在.NET端,我们接收/传输JSON中的所有对象而不是XML(我们使用Newtonsoft JSON生成器,因为来自WCF Web服务的.NET默认JSON生成会产生问题,尤其是日期)。在GWT方面,我们使用覆盖类型。

我们编写了一个应用程序,它生成代码(来自.NET应用程序)并自动将其写入我们的GWT项目 - 它生成我们需要的所有类,并编写函数以便轻松调用Web服务。最重要的是,当我们在GWT中运行应用程序时,我们能够使.NET Web服务正常运行,这使得它很容易调试。然后当我们完成项目更改时,我们编译为javascript / html - 将其复制到visual studio,并部署我们的项目。不可能更简单。

在这个帖子的帮助下完成所有这些工作需要做很多工作,但是因为我们是一个拥有SQL服务器后端和IIS Windows服务器的直接微软商店,所以我们完全值得。 Silverlight非常棒,但现在我们正在努力工作人员获得打击垫,并且还需要在手机上运行应用程序。

我们使用UIBinder作为界面。喜欢GUI设计器/ xml声明性布局和模块化。通过在UI中使用UiBinder HTML面板,仍然可以使用我们想要的任何HTML / CSS。 uiBinder设计师甚至可以识别CSS3标签并使它们比IE9更好。

GWT是一个很好的解决方案,Java很容易从C#背景中学习。