Announcement

Collapse
No announcement yet.

HTTP Request

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • HTTP Request

    Hi all,

    ich würde gerne einen HTTP-Request innerhalb einer StoredProc durchführen.
    Weiss jemand, ob und wie sowas unter T-SQL möglich ist?

    Danke, Andi

  • #2
    Hallo Andi,

    du kannst den Request z.B. in C# schreiben und eine Methode mit CLR-Procedures aufrufen
    siehe dazu: CLR Stored Procedures

    lg chapster

    Comment


    • #3
      Hallo chapster,

      Danke für den Hinweis. Vom Ansatz her funktioniert das schon recht gut. Scheinbar hab ich
      aber ein Berechtigungsproblem, von dem ich nicht weiss, wie ich's lösen kann.

      Mein VB.Net Code:

      Code:
      Imports System.IO
      Imports System.Net
      Imports System.Text
      Imports System.Configuration
      Imports System
      
      
      Public Class CLRFunctions   
          
      	Public Shared Function SendSMS(ByVal Rufnummer As String, ByVal Text As String) As String  
              
      		Dim returnValue as string
      		Dim webrequest As HttpWebRequest = HttpWebRequest.Create("http://gateway.any-sms.biz/send_sms.php?id=xxxxx&pass=xxxxx&gateway=10&long=1&nummer=" & Rufnummer & "&text=" & Text)
                      webrequest.Credentials = CredentialCache.DefaultCredentials
                      Dim response As HttpWebResponse = CType(webrequest.GetResponse(), HttpWebResponse)
                      Dim dataStream As Stream = response.GetResponseStream()
                      Dim reader As New StreamReader(dataStream)
                      Dim responseFromServer As String = reader.ReadToEnd()
                      returnValue = Left(responseFromServer, 8) + "  " + Rufnummer
                      reader.Close()
                      dataStream.Close()
                      response.Close()
         		Return returnValue
      
          	End Function  
      
      End Class
      Ich hab im SQL Server die Assembly angelegt:

      Code:
      CREATE ASSEMBLY CLRFunctions FROM 'C:\SQLServerCLR_SendSMS.dll' 
      GO
      Ausserdem eine Funktion
      Code:
      CREATE FUNCTION CLR_SendSMS   
      (   
      	@Rufnummer AS NVARCHAR(255),
      	@Text AS NVARCHAR(max)
      )    
      RETURNS NVARCHAR(255)   
      AS EXTERNAL NAME CLRFunctions.CLRFunctions.SendSMS
      GO
      Bei folgendem SQL-Statement
      Code:
      SELECT dbo.CLR_SendSMS('xxxxxxxxxxxx','Test')
      erhalte ich folgenden Fehler:

      Meldung 6522, Ebene 16, Status 1, Zeile 2
      .NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder des benutzerdefinierten Aggregats 'CLR_SendSMS':
      System.Security.SecurityException: Request for the permission of type 'System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
      System.Security.SecurityException:
      at System.Security.CodeAccessSecurityEngine.Check(Obj ect demand, StackCrawlMark& stackMark, Boolean isPermSet)
      at System.Security.CodeAccessPermission.Demand()
      at System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint)
      at System.Net.HttpRequestCreator.Create(Uri Uri)
      at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
      at System.Net.WebRequest.Create(String requestUriString)
      at CLRFunctions.SendSMS(String Rufnummer, String Text)
      .


      Hat jemand eine Idee, was da noch an Einstellung fehlt?

      Comment


      • #4
        Hallo Andi,

        hab während des schreibens schon wieder vergessen gehabt, dass du einen HTTP-Request machst.
        Das Problem liegt sehr wahrscheinlich am Assembly.
        Da gibt es so eine Art Securitylevel. Wenn du im VB-Code auf Services, Dateien, etc. von einem anderen Server zugreifen willst als derjenige von dem der Aufruf kommt musst du die Berechtigungen erweitern.

        Beispiel:
        [highlight=sql]
        CREATE ASSEMBLY CLRFunctions FROM 'C:\SQLServerCLR_SendSMS.dll'
        WITH PERMISSION_SET = EXTERNAL_ACCESS
        [/highlight]

        Standardwert ist SAFE (=kein Zugriff auf externe Daten)

        Weiter Infos zu dem Thema hier

        hoffe das Hilft

        lg chapster

        Comment


        • #5
          Hallo chapster,

          funktioniert jetzt einwandfrei. Ich musste vorher nur noch

          Code:
          ALTER DATABASE MyDatabase SET TRUSTWORTHY ON
          absetzen.

          Danke für Deine Hilfe,
          ciao Andi

          Comment


          • #6
            hallo,
            öhm wenn ich das richtig verstehe kannst du jetzt am SQL-Server durch ein SQL-Statement oder Prozedur eine SMS versenden??
            Welchen Versender nutzt du dafür? Funktioniert das immer? Nutzt du es eher für vernachlässigbare Benachrichtigung oder auch kritische wie Systemstillstand o.ä.? Muss dann der SQL-Server eine Verbindung ins Internet haben?

            Darf ich deinen geposteten Code in meiner eigenen unternehmensinternen Anwendung einsetzen?

            Comment

            Working...
            X