【问题标题】:Are Http Handlers the appropriate choice of architecture?Are Http Handlers the appropriate choice of architecture?
【发布时间】:2012-05-10 21:05:42
【问题描述】:

目前我们的软件由一个 winForms 应用程序组成,该应用程序调用多个 Web 服务,它们之间有数百个 Web 方法。

出于多种原因,我们正在转向纯 Web 架构(jQuery Mobile、jQuery、HTML5、LawnChair)。网页只会处理呈现,所有的业务逻辑都会发生在服务器端。所以我需要从网页中调用这些网络服务。

我知道必须有很多方法可以做到这一点,例如,我一直在试验 jQuery 为每个 Web 方法调用服务器端 HttpHandlers。由于 jQuery 使用 JSON,我不能直接调用 XML SOAP,因此需要在顶部添加一个新层,以便可以从 jQuery 调用。

但是,这是正确的方法吗?是否有另一种更合适的方法,即实现更少的努力,possibly using WCF,或其他我忽略的方法?

【问题讨论】:

  • 我不完全确定您是在询问服务器端代码还是客户端代码..所以我回答了客户端请求,因为没有必要为它们修改任何现有服务或代码.. 除非您正在创建新的桥接 API 之类的?
  • @ppumkin 从使用 JSON 的 jQuery 调用的服务器端处理程序。我们当前使用的 Web 服务是 XML SOAP,这些不能为了向后兼容而改变,所以我们需要中间的东西。
  • 哦,对了.. 太糟糕了,所以我的回答是垃圾。对不起。我认为你在做什么......不可原谅是唯一的方法(至少我知道)
  • @ppumkin 对不起,我不明白......我在做什么是不可原谅的?你的意思是这是唯一的方法吗?
  • 这就是您不使用 SOAP 的原因。祝您与 SOAP API 交谈顺利。

标签: jquery .net web-services architecture


【解决方案1】:

您可以从 jQuery 使用 XML Web 服务。它可以很好地处理 XML 消息。但是,在 JavaScript 中创建和读取 SOAP 消息很糟糕。

什么是合适的取决于你。但是,使用 WCF REST 甚至更好的 ASP.NET MVC4 WebAPI 将通过管道引导您的应用程序,并让您专注于相当快速地交付工作应用程序。但是,这将需要对您的原始服务进行一些重写(无论如何,您似乎注定要这样做)。

【讨论】:

    【解决方案2】:

    不确定这是否可以帮助您,但我们使用像 ajax.asmx 这样的网络服务,我们使用 jQueries ajax 来调用它

    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    Imports System.ComponentModel
    Imports ClsLib
    Imports Microsoft.WindowsAzure.StorageClient
    Imports Microsoft.WindowsAzure
    
    ' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    <System.Web.Script.Services.ScriptService()> _
    <System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
    <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <ToolboxItem(False)> _
    Public Class Ajax
    
    <System.Web.Services.WebMethod()> _
    Public Function function1(byval first as string, byval second as string) as string
        'do something here
        Return someJsonAsString
    End Function
    
    End Class
    

    我想这样的东西可以帮助你。

    但是您可以创建自己的类来处理现有的 SOAP XML 服务,它只需要更多的客户端代码

    var productServiceUrl = 'http://localhost:57299/ProductService.asmx?op=SaveProduct'; // Preferably write this out from server side
    
    function beginSaveProduct(productID, productName, manufactureDate)
    {
    var soapMessage =
    '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> \
    <soap:Body> \
    <SaveProduct xmlns="http://sh.inobido.com/"> \
    <productID>' + productID + '</productID> \
    <productName>' + productName + '</productName> \
    <manufactureDate>' + manufactureDate + '</manufactureDate> \
    </SaveProduct> \
    </soap:Body> \
    </soap:Envelope>';
    
    $.ajax({
    url: productServiceUrl,
    type: "POST",
    dataType: "xml",
    data: soapMessage,
    complete: endSaveProduct,
    contentType: "text/xml; charset=\"utf-8\""
    });
    
    return false;
    }
    
    function endSaveProduct(xmlHttpRequest, status)
    {
     $(xmlHttpRequest.responseXML)
        .find('SaveProductResult')
        .each(function()
     {
       var name = $(this).find('Name').text();
     });
    }
    

    并在 jQuery 中解析 SOAP 响应。我认为有插件。

    【讨论】:

    • 那不需要修改现有的服务吗?如果我更改他们的界面,我们现有的客户端应用程序将会中断。
    • 很难确定要更改的内容。它认为最好的长期解决方案是创建一个单独的 JSON 友好服务/接口,该服务/接口调用您的 SOAP 替代服务所执行的相同业务逻辑,并且只使用 jQuery 而无需任何更复杂的客户端源代码并逐步淘汰肥皂服务以避免同时维护两者.
    猜你喜欢
    • 2021-06-18
    • 2021-01-15
    • 2020-02-14
    • 2022-12-12
    • 2022-12-26
    • 2022-12-27
    • 2022-12-28
    • 2022-12-27
    • 1970-01-01
    相关资源
    最近更新 更多