C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

./をURLエンコードする?

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■96783 / inTopicNo.1)  ./をURLエンコードする?
  
□投稿者/ ぽりたん (1回)-(2021/02/04(Thu) 13:36:11)

分類:[.NET 全般] 

データベースを更新する為にWebAPIで更新内容を受けているのですが
WebAPI側のルート設定を、Master/Insert/{Code1}/{Code2}/ とした時
例えばCode1に hogeINC. と入力された時、URLは http://localhost/Master/Insert/hogeINC./hogehoge/ となり
リソースが見つかりませんでした、のエラーになります。
hogeINC.のピリオドをつけないと http://localhost/Master/Insert/hogeINC/hogehoge/ となりWebAPIで正しく受けることが可能になります。
たぶん ./ が問題なんでしょうが
./を上手くWebAPI側に渡すテクニックって何かないでしょうか
引用返信 編集キー/
■96793 / inTopicNo.2)  Re[1]: ./をURLエンコードする?
□投稿者/ WebSurfer (2187回)-(2021/02/05(Fri) 09:52:12)
No96783 (ぽりたん さん) に返信

> たぶん ./ が問題なんでしょうが

ピリオドは url として有効な文字で、表題に書いてあった「./をURLエンコードする?」では
結果はピリオドのままで除去されるわけではありません。サーバーには hogeINC. というフォ
ルダはないので見つからないというエラーになっているのでしょう。

> ./を上手くWebAPI側に渡すテクニックって何かないでしょうか

クライアント側で url の文字列を組み立てているのであればそこでピリオドを除去するか、
それがダメならサーバー側で url 書き換えなどの手段を考えてはいかがですか?
引用返信 編集キー/
■96794 / inTopicNo.3)  Re[1]: ./をURLエンコードする?
□投稿者/ 魔界の仮面弁士 (2962回)-(2021/02/05(Fri) 11:32:40)
2021/02/05(Fri) 11:40:33 編集(投稿者)

No96783 (ぽりたん さん) に返信
> データベースを更新する為にWebAPIで更新内容を受けているのですが
> WebAPI側のルート設定を、Master/Insert/{Code1}/{Code2}/ とした時

.NET の質問とのことですが、.NET で組まれているのは
サーバーサイド / クライアントサイドのいずれでしょうか。
あるいはその両方が自作の .NET アプリなのでしょうか。


> たぶん ./ が問題なんでしょうが

それが原因だとして、URL 中のピリオドをパーセントエンコーディングするために
クライアント側のアプリを修正したいという相談なのか、
それとも、ピリオドでも受け入れられるよう、サーバー側を
修正したいという質問なのか、分かりませんでした。

どちらにせよ、アプリの構成がどうなっているか分からない事には、
どう修正すべきかアドバイスすることも難しいです。


> WebAPI側のルート設定を、Master/Insert/{Code1}/{Code2}/ とした時

WebAPI のフレームワークが分かりませんが、
とりあえずこんなコードを書いてみたところ、
ブラウザーからの
 https://localhost/Master/Insert/hogeINC./hogehoge/
や、コマンドラインからの
 curl https://localhost/Master/Insert/hogeINC%2E/hogehoge/
 curl https://localhost/Master/Insert/hogeINC./hogehoge/
のいずれにおいても、ピリオド付きの ["hogeINC.","hogehoge"] が得られることを確認しています。


using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace Wankuma96783.Controllers
{
 [ApiController]
 public class MasterController : ControllerBase
 {
  [HttpGet("/Master/Insert/{code1}/{code2}/")]
  public IEnumerable<string> Insert(string code1, string code2)
  {
   return new string[] { code1, code2, };
  }
 }
}
引用返信 編集キー/
■96795 / inTopicNo.4)  Re[2]: ./をURLエンコードする?
□投稿者/ ぽりたん (2回)-(2021/02/05(Fri) 17:42:14)
No96794 (魔界の仮面弁士 さん) に返信
> 2021/02/05(Fri) 11:40:33 編集(投稿者)
>
> ■No96783 (ぽりたん さん) に返信
>>データベースを更新する為にWebAPIで更新内容を受けているのですが
>>WebAPI側のルート設定を、Master/Insert/{Code1}/{Code2}/ とした時
>
> .NET の質問とのことですが、.NET で組まれているのは
> サーバーサイド / クライアントサイドのいずれでしょうか。
> あるいはその両方が自作の .NET アプリなのでしょうか。
>
>
>>たぶん ./ が問題なんでしょうが
>
> それが原因だとして、URL 中のピリオドをパーセントエンコーディングするために
> クライアント側のアプリを修正したいという相談なのか、
> それとも、ピリオドでも受け入れられるよう、サーバー側を
> 修正したいという質問なのか、分かりませんでした。
>
> どちらにせよ、アプリの構成がどうなっているか分からない事には、
> どう修正すべきかアドバイスすることも難しいです。
>
>
>>WebAPI側のルート設定を、Master/Insert/{Code1}/{Code2}/ とした時
>
> WebAPI のフレームワークが分かりませんが、
> とりあえずこんなコードを書いてみたところ、
> ブラウザーからの
>  https://localhost/Master/Insert/hogeINC./hogehoge/
> や、コマンドラインからの
>  curl https://localhost/Master/Insert/hogeINC%2E/hogehoge/
>  curl https://localhost/Master/Insert/hogeINC./hogehoge/
> のいずれにおいても、ピリオド付きの ["hogeINC.","hogehoge"] が得られることを確認しています。
>
>
> using Microsoft.AspNetCore.Mvc;
> using System.Collections.Generic;
> namespace Wankuma96783.Controllers
> {
>  [ApiController]
>  public class MasterController : ControllerBase
>  {
>   [HttpGet("/Master/Insert/{code1}/{code2}/")]
>   public IEnumerable<string> Insert(string code1, string code2)
>   {
>    return new string[] { code1, code2, };
>   }
>  }
> }


初期の説明が雑ですいませんでした
環境としましては自作のandroidアプリで入力されたデータcode1とcode2をURL化してURLエンコードを施した後に
MVCで自作したWebAPIに投げてcode1とcode2のデータを取得後SQLSERVERにINSERTしています。

上記で上手くいっていたのですが、code1にとある会社名(HogeINC.)と入力された時
リソースが見つかりませんでした。のエラーが発生しました。
調査しましたところ./がWebSurfer様が書かれている通りフォルダを見に行くことになっている?ようで
エラーが発生しているように思えました。
実際にピリオドを除外するとエラーは発生しなくなりました。

という事で魔界の仮面弁士様のレス↓は現環境にばっちり当てはまっていました。


> WebAPI のフレームワークが分かりませんが、
> とりあえずこんなコードを書いてみたところ、
> ブラウザーからの
>  https://localhost/Master/Insert/hogeINC./hogehoge/
> や、コマンドラインからの
>  curl https://localhost/Master/Insert/hogeINC%2E/hogehoge/
>  curl https://localhost/Master/Insert/hogeINC./hogehoge/
> のいずれにおいても、ピリオド付きの ["hogeINC.","hogehoge"] が得られることを確認しています。
>
>
> using Microsoft.AspNetCore.Mvc;
> using System.Collections.Generic;
> namespace Wankuma96783.Controllers
> {
>  [ApiController]
>  public class MasterController : ControllerBase
>  {
>   [HttpGet("/Master/Insert/{code1}/{code2}/")]
>   public IEnumerable<string> Insert(string code1, string code2)
>   {
>    return new string[] { code1, code2, };
>   }
>  }
> }


ですが同じようにプログラミングをしているはずなのに
なぜかピリオド付きのみ得られないのです。

public class MasterController : ApiController
{
[HttpGet]
[Route("Master/Insert/{strCode1}/{strCode2}")]
public IEnumerable<clsMaster.mDropDownItem> F_listInsMaster(string strCode1, string strCode2)
{

Code1とCode2データをSQLSERVERにINSERT

clsMaster.mDropDownItem obj = new clsMaster.mDropDownItem();
obj.code = "Code1";
obj.state = "State1";
listM.Add(obj);

return listM;
}
}


VisualStudio2017から実行してhttps://localhost/Master/Insert/hogeINC./hogehoge/を投げると
やっぱりリソースが見つかりませんでした。のエラーが発生します。
ピリオドを除外すると上記の関数に到達して正しく処理は実行されます。

色々調べましたところ環境によってピリオドが取得できない?ような事象もあるみたいでした。
(web.config?)

引用返信 編集キー/
■96796 / inTopicNo.5)  Re[3]: ./をURLエンコードする?
□投稿者/ 魔界の仮面弁士 (2963回)-(2021/02/05(Fri) 18:07:44)
2021/02/05(Fri) 20:51:59 編集(投稿者)

No96795 (ぽりたん さん) に返信
> という事で魔界の仮面弁士様のレス↓は現環境にばっちり当てはまっていました。

いや、全然別の環境だと思うのですが…。(^_^;)

私のコードは Microsoft.AspNetCore.Mvc.ControllerBase を継承したもので、
ぽりたんさんの方は System.Web.Http.ApiController を継承したものですよね。


ASP.NET MVC + .NET Framework
ASP.NET Core MVC + .NET Framework
ASP.NET Core MVC + .NET Core
などの組み合わせがありますので、どのフレームワークのどのバージョンを
使っているのかを明確にしましょう。


> 色々調べましたところ環境によってピリオドが取得できない?ような事象もあるみたいでした。
たとえば ASP.NET MVC4 であれば、web.config の
/configuration/system.web/httpRuntime 要素に、
relaxedUrlToFileSystemMapping="true" の属性を付与してみてください。

<削除>
/hogeINC%2E/ の方は "hogeINC" になってしまいますが、
/hogeINC./ については "hogeINC." で得られると思います。
</削除>

試してみたら駄目でした。
エラーになる現象は回避できましたが、渡される文字列は
"hogeINC" になってしまいますね。済みません。


Core じゃない方の MVC は殆ど触ったことが無いので、
自分だとあまりお力にはなれないかも知れないです。
IIS / IIS Express / Cassini の動作の違いとかも詳しくないですし。


こんな記事もありましたが、Web サーバーのバージョンにもよるんですかね。
プロジェクト作成時のテンプレートをあまり触っていないので、
RAMMFAR (runAllManagedModulesForAllRequests) 周りの設定とか、
あまり気にしてなかったです。識者のフォローを待ちたい。
https://support.microsoft.com/en-us/topic/525f06bd-125b-9fb7-0564-327172f1912f
引用返信 編集キー/
■96797 / inTopicNo.6)  Re[4]: ./をURLエンコードする?
□投稿者/ ぽりたん (3回)-(2021/02/09(Tue) 10:07:31)
No96796 (魔界の仮面弁士 さん) に返信
> 2021/02/05(Fri) 20:51:59 編集(投稿者)
>
> ■No96795 (ぽりたん さん) に返信
>>という事で魔界の仮面弁士様のレス↓は現環境にばっちり当てはまっていました。
>
> いや、全然別の環境だと思うのですが…。(^_^;)
>

すいません。まだMVCの事よくわかってなくて・・・
色々探しましたが対処方法も見つからなく日もないので
androidアプリ側で文字列の末尾に適当な文字(今回は→「_」)を1文字加えて
受けたAPI側で↓の関数を使用して強制的に末尾一文字を削るようにしました。

private string F_strLastRemove(string strVal)
{
if (strVal.Length > 0)
{
strVal = strVal.Remove(strVal.Length - 1);
}

return strVal;
}

中途半端ではありますが一応解決という事にさせていただきます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ