0

後者がこの問題を修正したため、async_sinatra 0.5.0 から 1.0 にアップグレードしました。

ここまでは順調ですね。しかし、認証を含む元のアプリ (テスト アプリではなく) に戻ると、機能しなくなりました。私は vb.net を使用して webrequest を作成しています。

"The remote server returned an error: (401) Unauthorized."

ここに私のルビーコードがあります:

#gem  'async_sinatra', '0.5.0'
require 'sinatra/async'

class AsyncQueryServer < Sinatra::Base
  register Sinatra::Async

  set :server, 'thin'
  set :port, 19876
  enable :show_exceptions

  helpers do
    def protected!
      unless authorized?
        response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
        throw(:halt, [401, "Not authorized\n"])
      end
    end

    def authorized?
      @auth ||=  Rack::Auth::Basic::Request.new(request.env)
      begin
        puts "@auth.provided? #{@auth.provided?}"
        puts "@auth.basic? #{@auth.basic?}"
        puts "@auth.credentials #{@auth.credentials}"
      rescue Exception => e
        puts e.message
      end
      @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['myusername', 'mypassword']
    end
  end

  apost '/execfqy' do
    protected!
    body request.body.string
  end

  not_found do
    puts "in not found, request.fullpath #{request.fullpath}"
    puts "in not found, request.request_method #{request.request_method}"
    puts "in not found, request.params #{request.params}"
    puts "in not found, request.class #{request.class}"

    redirect '/'
  end

end

AsyncQueryServer.run!

async_sinatra 1.0 へのアップグレードだと確信しています。

#gem  'async_sinatra', '0.5.0'

期待どおりに動作します。

興味深いことに、puts ステートメントの出力は、authorized? は両方のバージョンで同じであり、以下を示しています。

@auth.provided? false 
undefined method `split' for nil:NilClass
@auth.provided? true 
@auth.basic? true 
@auth.credentials ["myusername", "mypassword"]

そして、これはこのページに基づいたvb.netのスニペットで、webrequestを作成します:

Private Function GetOutput(jsonDataBytes As Byte()) As String
        Dim req As WebRequest
        Dim res As String
        '        Dim cred As New Net.NetworkCredential("myusername", "mypassword")
        Dim cred As New Net.NetworkCredential("myusername", "mypassword")
        Dim req_str As String

        req_str = _urlString & ":" & _portString & "/execfqy"

        req = WebRequest.Create(req_str)

        req.ContentType = "application/json"
        req.Method = "POST"
        req.ContentLength = jsonDataBytes.Length
        req.Credentials = cred

        Dim stream = req.GetRequestStream()
        stream.Write(jsonDataBytes, 0, jsonDataBytes.Length)
        stream.Close()

        Try
            Dim response = req.GetResponse().GetResponseStream()
            Dim reader As New StreamReader(response)
            res = reader.ReadToEnd()
            reader.Close()
            response.Close()
        Catch e As WebException
            Throw New NoResultsError("Request return nil results with error: " & e.Message)
            res = Nothing
        End Try

        Return res
End Function 

ヘルプ/提案/リダイレクトをいただければ幸いです。

ティア

4

1 に答える 1

0

修正方法は次のとおりです。vb.netネイティブメソッドを放棄し、chilkatのhttpコンポーネントを使用しました。よく働く。コードは次のとおりです。

Private Function GetOutputChilkatPostJson(jsonData As String) As String
    'Dim req As New Chilkat.HttpRequest()
    Dim http As New Chilkat.Http()
    Dim res As String
    Dim req_str As String
    Dim success As Boolean

    req_str = _urlString & ":" & _portString & "/execfqy"

    '  Any string unlocks the component for the 1st 30 days.
    success = http.UnlockComponent("Anything for 30-day trial")
    If (success <> True) Then
        MsgBox(http.LastErrorText)
        Exit Function
    End If


    '  This example duplicates the HTTP POST shown at
    '  http://json.org/JSONRequest.html

    '  Specifically, the request to be sent looks like this:
    '  
    'POST /request HTTP/1.1
    'Accept: application/jsonrequest
    '        Content(-Encoding) : identity()
    'Content-Length: 72
    'Content-Type: application/jsonrequest
    'Host:   json.penzance.org()

    '{"user":"doctoravatar@penzance.com","forecast":7,"t":"vlIj","zip":94089}


    '  First, remove default header fields that would be automatically
    '  sent.  (These headers are harmless, and shouldn't need to
    '  be suppressed, but just in case...)
    http.AcceptCharset = ""
    http.UserAgent = ""
    http.AcceptLanguage = ""
    http.Login = "myusername"
    http.Password = "mypassword"
    '  Suppress the Accept-Encoding header by disallowing
    '  a gzip response:
    http.AllowGzip = False

    '  If a Cookie needs to be added, it may be added by calling
    '  AddQuickHeader:
    'http.AddQuickHeader("Cookie", "JSESSIONID=1234")

    '  To use SSL/TLS, simply use "https://" in the URL.

    '  IMPORTANT: Make sure to change the URL, JSON text,
    '  and other data items to your own values.  The URL used
    '  in this example will not actually work.

    Dim resp As Chilkat.HttpResponse
    Try
        resp = http.PostJson(req_str, jsonData)
        res = resp.BodyStr
    Catch e As WebException
        Throw New NoResultsError("Request return nil results with error: " & e.Message)
        res = Nothing
    End Try
    Return res
End Function
于 2012-05-03T16:14:51.610 に答える