`
qiezi
  • 浏览: 497656 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[RoR] 在RoR中调用.Net webservice

    博客分类:
  • Ruby
阅读更多
首先写一个简单的webservice:

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace 
= "http://tempuri.org/")]
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    [WebMethod]
    
public string HelloWorld(string name) {
        
return "Hello, " + name;
    }
    
}

在RoR项目里,添加app/apis/test_api.rb:

class TestApi < ActionWebService::API::Base
  api_method :HelloWorld, :expects 
=> [{:name => :string}], :returns => [:string]
end

这是RoR里面通用的webservice元信息描述。

添加app/controllers/test_controller.rb:

class TestController < ApplicationController
  web_client_api :test, :soap, 
"http://localhost/test/Service.asmx"
                 :namespace 
=> "http://tempuri.org/",
                 :soap_action_base 
=> "http://tempuri.org",
                 :driver_options
=>{:default_encodingstyle => SOAP::EncodingStyle::ASPDotNetHandler::Namespace }

  
def hello
    render_text test.HelloWorld(
"Li Jie")
  end
end

:soap_action_base选项是一个修补,不加这个选项会产生SOAPAction头错误。

运行服务器,在浏览器中访问/test/hello,发现名字为空。经过长时间调试,发现.Net在解析SOAP消息体时,不能处理这种命名空间:

    <n1:HelloWorld xmlns:n1="http://tempuri.org/"
        soap:encodingStyle
="http://schemas.xmlsoap.org/soap/encoding/">
      
<name xsi:type="xsd:string">Li Jie</name>
    
</n1:HelloWorld>

把n1去掉就行了。不过这部分实现在rubylib/soap/rpc/proxy.rb里面,实在不方便修改。为了让这个测试通过,暂时做了点小修改:

  def route(req_header, req_body, reqopt, resopt)
    req_env 
= ::SOAP::SOAPEnvelope.new(req_header, req_body)
    unless reqopt[:envelopenamespace].nil?
      set_envelopenamespace(req_env, reqopt[:envelopenamespace])
    end
    reqopt[:external_content] 
= nil
    conn_data 
= marshal(req_env, reqopt)
    
if ext = reqopt[:external_content]
      mime 
= MIMEMessage.new
      ext.each do 
|k, v|
          mime.add_attachment(v.data)
      end
      mime.add_part(conn_data.send_string 
+ "\r\n")
      mime.close
      conn_data.send_string 
= mime.content_str
      conn_data.send_contenttype 
= mime.headers['content-type'].str
    end

    conn_data.send_string.gsub!(
/:n1/'')
    conn_data.send_string.gsub!(
/n1:/''
)

    conn_data 
= @streamhandler.send(@endpoint_url, conn_data,
      reqopt[:soapaction])
    
if conn_data.receive_string.empty?
      
return nil
    end
    unmarshal(conn_data, resopt)
  end

加粗的2行是我添加的代码,勉强可以让它工作,不过显然不是正确的方法。

不知道是不是.Net库里面的BUG。
分享到:
评论

相关推荐

    ASP.NET项目移植ROR实践----DB转移(已完成)

    ASP.NET项目移植到Ruby on Rails (ROR)的实践中,DB转移是一个关键步骤。这个过程涉及到将现有的ASP.NET应用程序的数据模型、数据库结构以及业务逻辑迁移到ROR框架中。在这个过程中,我们需要理解两个不同框架之间的...

    RoR选题方向—源代码

    在这个选题方向中,我们主要探讨的是与RoR相关的源代码分析和学习。源代码是理解任何编程语言或框架工作原理的关键,对于RoR来说也不例外。 在深入源代码之前,我们需要了解RoR的一些核心概念。如ActiveRecord,它...

    RoR性能优化经验谈

    在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在使用RoR过程中积累的实际经验。 首先,RoR性能优化涉及到多个层面,包括应用程序的部署、服务器配置以及代码优化。在部署方面,操作系统的...

    Java、.Net、PHP、Ruby优劣势概览

    总结来说,Java适合大型和复杂的系统,.Net在Web开发中有一定竞争力,但需解决部署和前端问题;PHP在中小型企业Web应用中占据主导,且随着框架的成熟,其在企业级市场也有所突破;Ruby/ROR作为创新的象征,影响力虽...

    ror中文资料

    在提供的压缩包文件中,我们可以看到"Ruby语言中文教程",这暗示了资源可能包含了关于Ruby语言的基础知识和进阶内容,对于学习RoR至关重要。Ruby是RoR的基础,理解其语法和特性对于掌握RoR框架极其关键。 **Ruby...

    DBEntry.Net 参考手册

    RoR ActiveRecord style syntax Ambient transaction Dynamic object Partial update 1:1 1:Many Many:Many relations Auto create table Anti sql injection Multiple data source Object validation ...

    神经网络ror resenet模型

    在Ror块中,不仅有常规的残差学习,还有更高层次的残差学习,即残差学习的残差。这种多层次的结构使得网络能更细致地理解特征,并且有助于减少过拟合,提高模型的泛化能力。 **CIFAR-10和CIFAR-100数据集** CIFAR-...

    RoR中文解决方案(很不错哦)

    在RoR中,插件是一种可以扩展和定制框架功能的方式,它们通常包含模型、控制器、视图、帮助器以及其他相关的文件。这个插件可能解决了RoR在处理中文数据时的编码问题,使得用户无需访问特定网站下载,直接在项目中...

    ror实例

    "ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...

    ROR安装必备所有架包

    在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...

    ROR环境配置

    确保在安装过程中勾选添加Ruby到系统路径选项,以便于后续命令行调用。 接下来,安装Rails框架。打开终端或命令提示符,运行`gem install rails`命令,这会安装最新版本的Rails。如果遇到权限问题,可能需要加上`...

    .net文件上传

    在.NET框架中,文件上传是Web应用程序中常见的功能,尤其是对于ASP.NET平台。"ASP.NET支持断点续传,大文件上传"这个标题揭示了两个关键知识点:断点续传和处理大文件上传。 首先,让我们来理解断点续传的概念。...

    從 PL/SQL 中調用 ROR 创建的 Web 服务

    在 PL/SQL 中调用 ROR Web 服务通常涉及到以下几个步骤: 1. **了解 Web 服务接口**:首先,你需要熟悉 ROR 应用程序提供的 API 接口,包括它们的 URL、HTTP 方法(GET、POST、PUT、DELETE 等)、请求头和请求体。...

    ROR 文件的上传与下载

    1. **文件上传**:`UploadController`中的`create`方法接收上传的文件,并调用`SaveFile`模型的`save`方法将文件数据存储到数据库中。`SaveFile`模型的`save`方法读取文件的二进制流,并将其连同文件名一起保存到...

    初探ROR

    **初探ROR** Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat ...

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    Rails for .NET Developers (Facets of Ruby)

    这使得.NET开发者能够在自己熟悉的环境中快速上手RoR。 **知识点:** 1. **跨平台支持:** 介绍如何在不同的操作系统上安装和配置Ruby on Rails环境,包括Ruby版本管理工具如RVM或rbenv的使用。 2. **开发工具选择...

Global site tag (gtag.js) - Google Analytics