2009-03-21 14 views
0

でHttpWebrequestを使用した不安定な動作の解決現在、短縮URLの拡張を行うSQL Server 2008 udfを実装しようとしています。私たちは、主要なURL短縮サービスのほとんどに対して非常にうまく機能しています。しかし、一見無作為な時間に「ハング」し、特定のドメイン(例えばbit.ly)に対して動作することを拒否し、他のサービス(例えばtinyurl.com)への後続の呼び出しは引き続き成功します。SQL 2008 CLR UDF

これは、URL短縮サービスプロバイダによって何らかのブロックが行われたためだと思っていましたが、dbserverサービスを停止して再起動すると、後続のリクエストが成功する原因になります。 SQLサーバーが何らかの形で発信HTTP接続を何らかの形でプールしているのでしょうか?

はここ

using System; 
using System.Data; 
using System.Net; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 

public partial class UserDefinedFunctions 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlString UrlExpander(string url) 
    { 
      // Set up the Webrequest 
      HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(url); 
      try 
      { 

      // Set autoredirect off so the redirected URL will not be loaded 
      wr.AllowAutoRedirect = false; 

      // Get the response 
      HttpWebResponse wresp = (HttpWebResponse)wr.GetResponse(); 

      return new SqlString(wresp.Headers["Location"].ToString()); 
     } 
     catch (Exception ex) 
     { 
      wr.Abort(); 
      throw ex; 

     } 


    } 
}; 
+0

問題には関係しませんが、catch(Exception ex)は使用しないでください。代わりに、単にfinallyブロックの中にwr.Abort()を置いてください。 –

+0

ええ、それはほとんどの場合に当てはまりますが、この特定のUDFの性質を考慮すると、例外はTSQLレベルにバブリングする必要はありません。上記のコードの再暴行は、それがサーバーの復旧に役立つかどうかを確認するための実験的なものでした。私たちの考えでは、どちらかが動作するか、nullを返します。ありがとう。 – dan90266

答えて

1

あなたはwresp.Closeが欠落している...コードです()。

0

ジェシーからのフィードバックし、適切に拡張URLまたはNULLのいずれかを返す関数を持っている私たちの願いを考えると、我々はなし、さらに問題に縮小されたURLの1000を処理するように思わ以下が出ている:

[Microsoft.SqlServer.Server.SqlFunction] 
public static SqlString UrlExpander(string url) 
{ 
    // Set up the Webrequest 
    try 
    { 
     HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(url); 
     try 
     { 
      // Set autoredirect off so the redirected URL will not be loaded 
      wr.AllowAutoRedirect = false; 

      // Get the response 
      HttpWebResponse wresp = (HttpWebResponse)wr.GetResponse(); 
      wresp.Close(); 

      if (wresp != null) 
       return new SqlString(wresp.Headers["Location"].ToString()); 
     } 
     finally 
     { 
      if (wr != null) 
       wr.Abort(); 
     } 
    } 
    catch 
    { 
    } 

    return null; 

} 
関連する問題