• 締切済み

C# UriFormatExceptionの回避

お世話になります。 C#にて、WebRequest.Create(url);を 行うと、urlがhttp等で始まらない場合、例外を投げますが、 渡されたurlが『www.xxxxxx.jp』などのようにhttpを省略した 形式で渡されないよう、スキームを付けたurlに変換するための 方法を教えてください。 単に文字列を頭から見て、httpでなければ"http://"を追加…というのではなく、 専用のメソッドや手法を教えていただければと思います。 サイトを探せば見つかるとは思ったのですが、少し急ぎのため、 こちらで質問させていただきました。 よろしくお願いいたします。

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

もうちょい詰めるなら……  Uri uri = null;  if (Uri.TryCreate(Url, UriKind.Absolute, out uri) == false)   uri = new UriBuilder("http", Url).Uri; ってところでしょうか。 # Urlがstring型。 「http://」を付与してもURLにならない文字列を渡した場合にどうなるかは不明です。 https://とかftp://とか…URIとして正当だとプロトコルの変更はされませんけどね。 TryCreate()が成功した後のuri.Schemeプロパティで判定してよろしく処理してくださいな。

tatapatank
質問者

補足

ご回答、ありがとうございます。 返事が遅れ、大変申し訳ありません。 教えていただきました方法ですと、"http"なのか、 "https"なのか、はたまた"ftp"なのかの識別ができないと思われます。 それをできるようにするための質問なのですが…。 頂いた方法だと、ただ単に文字列として"http://"を付け加えるだけでも 同じ結果が得られると思います。 よろしくお願いいたします。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>サイトを探せば見つかるとは思ったのですが、少し急ぎのため、 >こちらで質問させていただきました。 回答待つより検索した方が早いと思いますけどねぇ……。 http://msdn.microsoft.com/ja-jp/library/system.uribuilder%28v=vs.100%29.aspx  UriBuilder myUri = new UriBuilder("http", "oshiete.goo.ne.jp/category/205");  Uri Test = myUri.Uri; こんなところでしょうか。 UriBuilderのコンストラクタの第2引数、ホスト名だけではなくても動作してくれたようです。 # Windows7&.NET Framework 4.0で確認。

関連するQ&A

  • C#でのWebRequestでのPOSTについて

    C#初心者です。 現在Visual Studio2012にてC#でストアアプリ作成中ですが、サーバーへPOSTしリストを取得する処理で難航しています。 WebRequest request = WebRequest.Create("URL"); request.Method = "POST"; byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteArray.Length; と記述した場合にrequest.ContentLengthの箇所でContentLengthはSystem.Net.WebRequestに定義が含まれていませんとエラーが表示されます。 何が足りないのでしょうか? 何か追加のアセンブリを指定する必要がありますでしょうか?

  • 小文字を大文字に変換する方法について

    Java初心者の者です。 パラメータに文字列を入力し 小文字の頭文字だけ大文字に変換させたものを繋げて出力させたいです。 例えば >>java Sample abc def g 15 hi AbcDefG15Hi のような感じです。 文字列を繋げるメソッドと 全てを大文字や小文字に変換させるメソッドは調べたらありましたが 頭文字のみを大文字に変換させるメソッドは自分では見つかりませんでした。 もしそのようなメソッド、もしくは方法がありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 数値で表示されている時間を秒単位に変換したい

    Excleの関数についての質問です。 ある表について、A列を「処理時間」としているのですが、その列は書式を時刻(XX:XX:XX)の形ではなく、数字で入力しています。 例えば、11:20:01であれば「112001」、00:00:01であれば「1」と入力されています。 (頭0は無し) ここに秒単位変換用の列を追加し、処理時間が1(時刻形式では00:00:01)であれば1、100(時刻形式では00:01:00)であれば60、10000(時刻形式では01:00:00)であれば3600というように、秒単位に変換する関数を組みたいのですが、どのようにすれば良いでしょうか?

  • C#でIEの操作ができないページの操作方法

    C#でIEを操作しようとしているのですが、HTMLを取得する際にエラーが出てしまします。なぜでしょうか? yahooなどのサイトのHTMLは取得できるのですが、実際にhtmlを取得したいサイトは「型 'System.Net.WebException' のハンドルされていない例外が System.dll で発生しました 追加情報:接続が切断されました: 送信時に、予期しないエラーが発生しました。」とエラーがでます。 HTMLが取得できないサイトがあるのでしょうか? その時にどうすればHTMLを取得し、操作できるのかその方法を教えてください。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Encoding enc = Encoding.GetEncoding("Shift_JIS"); string url = "https://www.yahoo.co.jp/"; WebRequest req = WebRequest.Create(url); WebResponse res = req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); Console.WriteLine(html); } } }

  • エクセル2003で

    教えてください。 エクセル2003で、例えば123456というデータ(表示形式は標準または文字列)を、頭に012を付けて012123456というデータ(表示形式は文字列)に変換する方法はありますか? いつも聞いてばかりで申し訳ありませんがよろしくお願いします。

  • 画像(jpg)⇒暗号⇒文字列(txt)⇒復号⇒画像(jpg)をやりたい

    画像(jpg)⇒暗号⇒文字列(txt)⇒復号⇒画像(jpg)をやりたい。 画像を文字列で取得して、 それを以下のURLの暗号メソッドを使用して http://dobon.net/vb/dotnet/string/encryptstring.html 変換した文字列をテキストで保管する。 そして、逆に先程のテキストを文字列で取得して、 先程のURLの復号メソッドを使用して、 変換した文字列をjpgで保管する。 これがやりたいのですが、 暗号する前と、暗号した後で変換される文字列が違ってしまいます。 画像とかは、テキストで開けるから普通に文字列として扱って問題ないのかな と思っているのですが・・・なんで違ってくるのかが分かりません。 ちなみに、URLのメソッド(暗号/復号)は普通の文字列での動作は確認が取れています。 自分がこれ原因かな~って思うと子は以下の通りです。 ・復号したファイルをファイルストリームで拡張子jpgにしている為、  画像ファイル作成時にしなければいけない処理が抜けている? ・読み込んだ文字列を一度テキストに書き込んでいる際に、何かしら文字コード関係で  不具合が生じている。 ・というか元々文字列で処理してjpgを暗号しようなんて無理 こんな私に助け舟を!! ・・・忘れていました。言語はC#です。 ご回答の程よろしくお願い致します。

  • Stringのフォーマットの変換方法(Java)

    Java実行時の引数として渡した14桁の数値(文字列)を、 ----- yyyy-mm-dd hh:mm:ss ----- の形式にフォーマット変換したいです。 (日時のように書いてますが、型はDateやTimestampではなくStringのままでもOK) 文字列をsubstringメソッドで区切って、 その後に「-」や「:」と+で文字列連結させる方法も考えたのですが、 そのようにせずにもう少しシンプルに変換する方法はありませんでしょうか?

    • ベストアンサー
    • Java
  • PHPのpack関数をJavaで実装できるのでしょうか

    PHPで文字列を16進バイナリ文字列に変換する関数であるpack関数というものがありますが、これと全く同じ動きをしてくれるメソッドがjavaには存在しないようです。これを自分で実装する方法をあれこれ考えているのですが、どうしてもうまくいきません。 下のようなメソッドを作ってみたのですが、戻ってくるのはただの数値文字列です。 /** * @param toPack バイナリへの変換対象の数値 */ String getHexBinary(int toPack){ String buf = ""; String hex = Integer.toString(toPack, 16); char decChars[] = hex.toCharArray(); for(int decChar : decChars){ buf += Integer.toHexString(decChar); } return buf; } PHPのpack関数はこの戻ってくる数値文字列を何らかの手法で結合しているように見えるのですが、その挙動が理解できずに困っています。どなたか、ご教授願えないでしょうか。ちなみに、Javaのバージョンは5.0でやっています。PHPのバージョンは5.2です。

    • ベストアンサー
    • Java
  • Date型からDate型への変換

    Date型の変換について質問です。 Date dt = new Date(); とすると「Thu Jan 25 14:41:33 JST 2007」のような内容のDateオブジェクトが生成されますよね。 これを「2007-01-25 14:41:33.000115」のようにDBでよく使用される形式のDateオブジェクトに変換したいんです。 SimpleDateFormatのformatメソッドを使用して String文字列「2007-01-25 14:41:33.000115」に変換して SimpleDateFormatのparseメソッドを使用すれば 上手くいくかと思ったのですが 「Thu Jan 25 14:48:09 JST 2007」というDateオブジェクトが返されてしまいます。 どのようにすれば期待する動作を実現できるでしょうか? 初歩的な質問かもしれませんが、 有識者の方々ご教授いただけますでしょうか。

    • ベストアンサー
    • Java
  • 継承したメソッドのドキュメンテーションコメント

    C#の開発を始めて日が浅いため、現場におけるお作法がわかりません。 現場におけるクラス・インターフェースを継承したメソッドのドキュメンテーションコメントの付け方に関する一般論についてお教えいただきたいです。 ※基底クラス、及びインターフェースの抽象メソッドにはドキュメンテーションコメントの記述がある物とします。 ※普段はJavaを使っている為、そこから引用している書いている部分があります。ご容赦下さい。 ・抽象クラスにおけるインターフェースから継承した抽象メソッド(実装しない場合) Javaとは違い、抽象クラスであってもインターフェースが持つの抽象メソッドを無視する事はできず、 public abstract修飾子を付けて抽象メソッドを定義してやる必要があるようなのですが、 この場合、ドキュメンテーションコメントは省略すべきでしょうか? それとも、何かしら記述するべきなのでしょうか?(Javaで言うところの@inheritDoc等・・・そのような物があるかはわかりませんが) ・新たに実装を行う場合(抽象メソッドの実装等) 省略すべきでしょうか? ・既存の実装を拡張し、変更の影響は微小かつメソッド内のみで完結し、概要やその他のメソッドの責任において表記すべき内容に変化が無い場合 省略すべきでしょうか? ・既存の実装を拡張し、想定される例外の追加等、メソッド外にも影響を及ぼす大きな変更が入った場合 新たに完全なドキュメンテーションコメントを作成するべきでしょうか? それとも差分以外は新たに作成すべきではないのでしょうか? 一般論と言っても規模や進め方によって様々だとは思いますが、 通念的に「心がけていくべき事」等あれば、是非お教え下さい。 最後に、この質問の趣旨からは外れるのですが、一つ追加で別の質問をさせてください。 私は何故抽象クラスがインターフェースの抽象メソッドを無視できないかがわかっておりません。 (インターフェース-インターフェース、抽象クラス-抽象クラスは無視できるのに) 敢えて明示的に定義を強要させている以上、何か理由あっての事だと思いますが、 それがわからず悶々村々としながら作業しております。 その理由をお教えいただけませんでしょうか。 宜しくお願い致します。

専門家に質問してみよう