2011-11-05 78 views
1

即時得到關於我從C#transleted到VB.NET下面的代碼下面的錯誤(原代碼可以在這裏找到:https://developer.linkedin.com/sites/default/files/LinkedInAuth.rar.zip):類'QueryParameterComparer'必須實現函數比較。

班「QueryParameterComparer」必須實現「功能比較(X作爲oAuthBase2.QueryParameter, y As oAuthBase2.QueryParameter)作爲接口'System.Collections.Generic.IComparer(Of QueryParameter)'的整數''。

我需要更改哪些內容?


' ' 該文件是由法提赫·亞薩爾在2009年11月27日 '

Imports System.Security.Cryptography 
Imports System.Collections.Generic 
Imports System.Text 
Imports System.Web 


Public Class oAuthBase2 

''' <summary> 
''' Provides a predefined set of algorithms that are supported officially by the protocol 
''' </summary> 
Public Enum SignatureTypes 
    HMACSHA1 
    PLAINTEXT 
    RSASHA1 
End Enum 

''' <summary> 
''' Provides an internal structure to sort the query parameter 
''' </summary> 
Protected Class QueryParameter 
    Private m_name As String = Nothing 
    Private m_value As String = Nothing 

    Public Sub New(ByVal name As String, ByVal value As String) 
     Me.m_name = name 
     Me.m_value = value 
    End Sub 

    Public ReadOnly Property Name() As String 
     Get 
      Return m_name 
     End Get 
    End Property 

    Public ReadOnly Property Value() As String 
     Get 
      Return m_value 
     End Get 
    End Property 
End Class 


Protected Class QueryParameterComparer 
    Implements System.Collections.Generic.IComparer(Of oAuthBase2.QueryParameter) 

#Region "IComparer<QueryParameter> Members" 

    Public Function Compare(ByVal x As oAuthBase2.QueryParameter, ByVal y As oAuthBase2.QueryParameter) As Integer 
     If x.Name = y.Name Then 
      Return String.Compare(x.Value, y.Value) 
     Else 
      Return String.Compare(x.Name, y.Name) 
     End If 
    End Function 

#End Region 
End Class 


Protected Const OAuthVersion As String = "1.0" 
Protected Const OAuthParameterPrefix As String = "oauth_" 

' 
' List of know and used oauth parameters' names 
'   
Protected Const OAuthConsumerKeyKey As String = "oauth_consumer_key" 
Protected Const OAuthCallbackKey As String = "oauth_callback" 
Protected Const OAuthVersionKey As String = "oauth_version" 
Protected Const OAuthSignatureMethodKey As String = "oauth_signature_method" 
Protected Const OAuthSignatureKey As String = "oauth_signature" 
Protected Const OAuthTimestampKey As String = "oauth_timestamp" 
Protected Const OAuthNonceKey As String = "oauth_nonce" 
Protected Const OAuthTokenKey As String = "oauth_token" 
Protected Const oAauthVerifier As String = "oauth_verifier" 
Protected Const OAuthTokenSecretKey As String = "oauth_token_secret" 

Protected Const HMACSHA1SignatureType As String = "HMAC-SHA1" 
Protected Const PlainTextSignatureType As String = "PLAINTEXT" 
Protected Const RSASHA1SignatureType As String = "RSA-SHA1" 

Protected random As New Random() 

Private oauth_verifier As String 
Public Property Verifier() As String 
    Get 
     Return oauth_verifier 
    End Get 
    Set(ByVal value As String) 
     oauth_verifier = value 
    End Set 
End Property 


Protected unreservedChars As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_.~" 

''' <summary> 
''' Helper function to compute a hash value 
''' </summary> 
''' <param name="hashAlgorithm">The hashing algoirhtm used. If that algorithm needs some initialization, like HMAC and its derivatives, they should be initialized prior to passing it to this function</param> 
''' <param name="data">The data to hash</param> 
''' <returns>a Base64 string of the hash value</returns> 
Private Function ComputeHash(ByVal hashAlgorithm As HashAlgorithm, ByVal data As String) As String 
    If hashAlgorithm Is Nothing Then 
     Throw New ArgumentNullException("hashAlgorithm") 
    End If 

    If String.IsNullOrEmpty(data) Then 
     Throw New ArgumentNullException("data") 
    End If 

    Dim dataBuffer As Byte() = System.Text.Encoding.ASCII.GetBytes(data) 
    Dim hashBytes As Byte() = hashAlgorithm.ComputeHash(dataBuffer) 

    Return Convert.ToBase64String(hashBytes) 
End Function 

''' <summary> 
''' Internal function to cut out all non oauth query string parameters (all parameters not begining with "oauth_") 
''' </summary> 
''' <param name="parameters">The query string part of the Url</param> 
''' <returns>A list of QueryParameter each containing the parameter name and value</returns> 
Private Function GetQueryParameters(ByVal parameters As String) As List(Of QueryParameter) 
    If parameters.StartsWith("?") Then 
     parameters = parameters.Remove(0, 1) 
    End If 

    Dim result As New List(Of QueryParameter)() 

    If Not String.IsNullOrEmpty(parameters) Then 
     Dim p As String() = parameters.Split("&"c) 
     For Each s As String In p 
      If Not String.IsNullOrEmpty(s) AndAlso Not s.StartsWith(OAuthParameterPrefix) Then 
       If s.IndexOf("="c) > -1 Then 
        Dim temp As String() = s.Split("="c) 
        result.Add(New QueryParameter(temp(0), temp(1))) 
       Else 
        result.Add(New QueryParameter(s, String.Empty)) 
       End If 
      End If 
     Next 
    End If 

    Return result 
End Function 

''' <summary> 
''' This is a different Url Encode implementation since the default .NET one outputs the percent encoding in lower case. 
''' While this is not a problem with the percent encoding spec, it is used in upper case throughout OAuth 
''' </summary> 
''' <param name="value">The value to Url encode</param> 
''' <returns>Returns a Url encoded string</returns> 
Public Function UrlEncode(ByVal value As String) As String 
    Dim result As New StringBuilder() 

    For Each symbol As Char In value 
     If unreservedChars.IndexOf(symbol) <> -1 Then 
      result.Append(symbol) 
     Else 
      result.Append("%"c & [String].Format("{0:X2}", AscW(symbol))) 
     End If 
    Next 

    Return result.ToString() 
End Function 

''' <summary> 
''' Normalizes the request parameters according to the spec 
''' </summary> 
''' <param name="parameters">The list of parameters already sorted</param> 
''' <returns>a string representing the normalized parameters</returns> 
Protected Function NormalizeRequestParameters(ByVal parameters As IList(Of QueryParameter)) As String 
    Dim sb As New StringBuilder() 
    Dim p As QueryParameter = Nothing 
    For i As Integer = 0 To parameters.Count - 1 
     p = parameters(i) 
     sb.AppendFormat("{0}={1}", p.Name, p.Value) 

     If i < parameters.Count - 1 Then 
      sb.Append("&") 
     End If 
    Next 

    Return sb.ToString() 
End Function 

''' <summary> 
''' Generate the signature base that is used to produce the signature 
''' </summary> 
''' <param name="url">The full url that needs to be signed including its non OAuth url parameters</param> 
''' <param name="consumerKey">The consumer key</param>   
''' <param name="token">The token, if available. If not available pass null or an empty string</param> 
''' <param name="tokenSecret">The token secret, if available. If not available pass null or an empty string</param> 
''' <param name="httpMethod">The http method used. Must be a valid HTTP method verb (POST,GET,PUT, etc)</param> 
''' <param name="signatureType">The signature type. To use the default values use <see cref="OAuthBase.SignatureTypes">OAuthBase.SignatureTypes</see>.</param> 
''' <returns>The signature base</returns> 
Public Function GenerateSignatureBase(ByVal url As Uri, ByVal consumerKey As String, ByVal token As String, ByVal tokenSecret As String, ByVal httpMethod As String, ByVal timeStamp As String, _ 
ByVal nonce As String, ByVal signatureType As String, ByRef normalizedUrl As String, ByRef normalizedRequestParameters As String) As String 
    If token Is Nothing Then 
     token = String.Empty 
    End If 

    If tokenSecret Is Nothing Then 
     tokenSecret = String.Empty 
    End If 

    If String.IsNullOrEmpty(consumerKey) Then 
     Throw New ArgumentNullException("consumerKey") 
    End If 

    If String.IsNullOrEmpty(httpMethod) Then 
     Throw New ArgumentNullException("httpMethod") 
    End If 

    If String.IsNullOrEmpty(signatureType) Then 
     Throw New ArgumentNullException("signatureType") 
    End If 

    normalizedUrl = Nothing 
    normalizedRequestParameters = Nothing 

    Dim parameters As List(Of QueryParameter) = GetQueryParameters(url.Query) 
    parameters.Add(New QueryParameter(OAuthVersionKey, OAuthVersion)) 
    parameters.Add(New QueryParameter(OAuthNonceKey, nonce)) 
    parameters.Add(New QueryParameter(OAuthTimestampKey, timeStamp)) 
    parameters.Add(New QueryParameter(OAuthSignatureMethodKey, signatureType)) 
    parameters.Add(New QueryParameter(OAuthConsumerKeyKey, consumerKey)) 

    If Not String.IsNullOrEmpty(token) Then 
     parameters.Add(New QueryParameter(OAuthTokenKey, token)) 
    End If 

    If Not String.IsNullOrEmpty(oauth_verifier) Then 
     parameters.Add(New QueryParameter(oAauthVerifier, oauth_verifier)) 
    End If 


    parameters.Sort(New QueryParameterComparer()) 


    normalizedUrl = String.Format("{0}://{1}", url.Scheme, url.Host) 
    If Not ((url.Scheme = "http" AndAlso url.Port = 80) OrElse (url.Scheme = "https" AndAlso url.Port = 443)) Then 
     normalizedUrl += ":" & url.Port 
    End If 
    normalizedUrl += url.AbsolutePath 
    normalizedRequestParameters = NormalizeRequestParameters(parameters) 

    Dim signatureBase As New StringBuilder() 
    signatureBase.AppendFormat("{0}&", httpMethod.ToUpper()) 
    signatureBase.AppendFormat("{0}&", UrlEncode(normalizedUrl)) 
    signatureBase.AppendFormat("{0}", UrlEncode(normalizedRequestParameters)) 

    Return signatureBase.ToString() 
End Function 


''' <summary> 
''' Generate the signature value based on the given signature base and hash algorithm 
''' </summary> 
''' <param name="signatureBase">The signature based as produced by the GenerateSignatureBase method or by any other means</param> 
''' <param name="hash">The hash algorithm used to perform the hashing. If the hashing algorithm requires initialization or a key it should be set prior to calling this method</param> 
''' <returns>A base64 string of the hash value</returns> 
Public Function GenerateSignatureUsingHash(ByVal signatureBase As String, ByVal hash As HashAlgorithm) As String 
    Return ComputeHash(hash, signatureBase) 
End Function 

''' <summary> 
''' Generates a signature using the HMAC-SHA1 algorithm 
''' </summary>  
''' <param name="url">The full url that needs to be signed including its non OAuth url parameters</param> 
''' <param name="consumerKey">The consumer key</param> 
''' <param name="consumerSecret">The consumer seceret</param> 
''' <param name="token">The token, if available. If not available pass null or an empty string</param> 
''' <param name="tokenSecret">The token secret, if available. If not available pass null or an empty string</param> 
''' <param name="httpMethod">The http method used. Must be a valid HTTP method verb (POST,GET,PUT, etc)</param> 
''' <returns>A base64 string of the hash value</returns> 
Public Function GenerateSignature(ByVal url As Uri, ByVal consumerKey As String, ByVal consumerSecret As String, ByVal token As String, ByVal tokenSecret As String, ByVal httpMethod As String, _ 
ByVal timeStamp As String, ByVal nonce As String, ByRef normalizedUrl As String, ByRef normalizedRequestParameters As String) As String 
    Return GenerateSignature(url, consumerKey, consumerSecret, token, tokenSecret, httpMethod, _ 
    timeStamp, nonce, SignatureTypes.HMACSHA1, normalizedUrl, normalizedRequestParameters) 
End Function 

''' <summary> 
''' Generates a signature using the specified signatureType 
''' </summary>  
''' <param name="url">The full url that needs to be signed including its non OAuth url parameters</param> 
''' <param name="consumerKey">The consumer key</param> 
''' <param name="consumerSecret">The consumer seceret</param> 
''' <param name="token">The token, if available. If not available pass null or an empty string</param> 
''' <param name="tokenSecret">The token secret, if available. If not available pass null or an empty string</param> 
''' <param name="httpMethod">The http method used. Must be a valid HTTP method verb (POST,GET,PUT, etc)</param> 
''' <param name="signatureType">The type of signature to use</param> 
''' <returns>A base64 string of the hash value</returns> 
Public Function GenerateSignature(ByVal url As Uri, ByVal consumerKey As String, ByVal consumerSecret As String, ByVal token As String, ByVal tokenSecret As String, ByVal httpMethod As String, _ 
ByVal timeStamp As String, ByVal nonce As String, ByVal signatureType As SignatureTypes, ByRef normalizedUrl As String, ByRef normalizedRequestParameters As String) As String 
    normalizedUrl = Nothing 
    normalizedRequestParameters = Nothing 

    Select Case signatureType 
     Case SignatureTypes.PLAINTEXT 
      Return HttpUtility.UrlEncode(String.Format("{0}&{1}", consumerSecret, tokenSecret)) 
     Case SignatureTypes.HMACSHA1 
      Dim signatureBase As String = GenerateSignatureBase(url, consumerKey, token, tokenSecret, httpMethod, timeStamp, _ 
      nonce, HMACSHA1SignatureType, normalizedUrl, normalizedRequestParameters) 

      Dim hmacsha1 As New HMACSHA1() 
      hmacsha1.Key = Encoding.ASCII.GetBytes(String.Format("{0}&{1}", UrlEncode(consumerSecret), If(String.IsNullOrEmpty(tokenSecret), "", UrlEncode(tokenSecret)))) 

      Return GenerateSignatureUsingHash(signatureBase, hmacsha1) 
     Case SignatureTypes.RSASHA1 
      Throw New NotImplementedException() 
     Case Else 
      Throw New ArgumentException("Unknown signature type", "signatureType") 
    End Select 
End Function 

''' <summary> 
''' Generate the timestamp for the signature   
''' </summary> 
''' <returns></returns> 

Public Overridable Function GenerateTimeStamp() As String 
    ' Default implementation of UNIX time of the current UTC time 
    Dim ts As TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, _ 
    0) 
    Return Convert.ToInt64(ts.TotalSeconds).ToString() 
End Function 

' 
'  public virtual string GenerateTimeStamp() { 
'   // Default implementation of UNIX time of the current UTC time 
'   TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); 
'   string timeStamp = ts.TotalSeconds.ToString(); 
'   timeStamp = timeStamp.Substring(0, timeStamp.IndexOf(",")); 
'   return Convert.ToInt64(timeStamp).ToString(); 
'  } 


''' <summary> 
''' Generate a nonce 
''' </summary> 
''' <returns></returns> 
Public Overridable Function GenerateNonce() As String 
    ' Just a simple implementation of a random number between 123400 and 9999999 
    Return random.[Next](123400, 9999999).ToString() 
End Function 

End Class 

回答

5

變更修改:

Public Function Compare(ByVal x As oAuthBase2.QueryParameter, ByVal y As oAuthBase2.QueryParameter) As Integer 

到:

Public Function Compare(ByVal x As oAuthBase2.QueryParameter, ByVal y As oAuthBase2.QueryParameter) As Integer Implements IComparer(Of oAuthBase2.QueryParameter).Compare 
+0

謝謝!這工作! – Flo

0

我剛剛結束在這裏尋找在VB.NET中實現接口的幫助。出於某種原因,我不得不使用這個語法功能:

Public Function MethodName1 As String Implements IInterfaceName.Methodname 

我只發現了這句法當我按下輸入接口名稱後輸入(特別),它爲我創造了這個自動。

可能會幫助其他人遇到與我一樣的問題!