Rails v1.2.3,ActionWebService和.NET平台作为客户端

时间:2009-06-17 21:39:27

标签: .net ruby-on-rails web-services

我正在项目中使用Rails 1.2.3。 (升级rails不是一种选择)。 我使用Rails创建了一个简单的测试Web服务。我已经使用Rails调用脚手架进行了测试。它似乎产生了没有问题的响应。

我正在尝试通过.NET设置客户端。我在C#中创建了一个ASP.NET Web App项目。我正在添加“Web引用”,将引用URL添加到向导的URL字段中,

http://mydomain.com:3000/backend/api

然后我收到了向导的错误:

  

下载时出错   'http://mydomain.com:3000/backend/api'   请求因错误而失败   消息:

     

不支持GET

     

下载时出错   'http://mydomain.com:3000/backend/api/ $的元数据'   请求因错误而失败   消息:

     

不支持GET

我的代码是:

# in app/apis/address_api.rb
class AddressApi < ActionWebService::API::Base
   api_method   :gettest, :returns => [:string]
end

# in app/controllers/backend_controller
class BackendController < ApplicationController
  wsdl_service_name 'Backend'
  web_service_api AddressApi
  web_service_scaffold :invoke

  def gettest
    return "hello"
  end

end

ActionWebService和.NET之间是否存在任何已知问题,或者我做错了什么?我的URL是否适用于rails web服务?

1 个答案:

答案 0 :(得分:0)

这可能已在其他地方得到解答,但由于在搜索google for actionwebservice并获取请求时弹出此问题,我想我会在这里回答。

默认情况下,AWS拒绝非POST请求。具体来说,它在action_controller_dispatcher.rb中的代码为:

def dispatch_web_service_request
  if request.get?
    render_text('GET not supported', '500 GET not supported')
    return
  end
  ..

基本上,您必须设置POST请求的请求,而不是GET。或者您必须覆盖AWS对GET请求的处理。 (您可能会尝试编辑gem中的代码,但是(1)在更新gem时会被覆盖;(2)我不确定一般的想法有多好(3)我从未尝试过它

如果您控制生成请求的代码,前者可能更合适。如果不这样做,Zack Chandler有一个解决方法(对于QuickBooks与Web服务的连接,但它应该适用于任何情况),here

如果网址发生变化,我会在下面引用它。

  

在lib / action_web_service_ext.rb

中创建补丁文件
module ActionController
  class Base

    alias_method :old_dispatch_web_service_request, :dispatch_web_service_request

    # --- [ QBWC requests the api url with a GET request upon loading the QWC file for the first time ] ---
    def dispatch_web_service_request
      render :nothing => true and return if request.get?
      old_dispatch_web_service_request
    end
  end
end
     

在config / environment.rb中启用补丁

require 'action_web_service_ext.rb'

显然,dispatch_web_service_request方法中的代码是特定于QuickBooks的,但你应该明白这一点。

希望这会有所帮助,我希望扎克不介意我重新发布。