92186


提示コードですが以下の例外が発生してしまう原因が知りたいです。URLはAPIサイトのものを入力してパラメータを設定しているのですがなぜ無効という例外が発生してまうのでしょうか？参考サイトを参考にソースコードを記述しましたが原因がわかりません。  
おそらくリダイレクトURLが違うのかと思うのですがどれが間違えているのでしょうか？

##### 確認したこと

`Console.WriteLine(url);`部にして以下ように出力されているためURLは確実に来ています

[code]

    https://mstdn.jp/api/v1/apps?client_name=test&redirect_uris=https%3A%2F%2Fmstdn.jp%2Fauth%2Fsign_in
    
[/code]

##### 知りたいこと

リダイレクトURLの正しい設定方法と以下の例外が発生してしまう原因が知りたい。

##### ソースコードの処理内容

提示コードは参考サイトのマストドンapiを用いて`OAuth トークンの取得に使用できるクライアント アプリケーションを登録します。`をするコードです。  
`GetLastUrl`関数はリダイレクトURLを取得す関数です。

##### 例外

`var req = WebRequest.Create(q);`コード部にて

[code]

    UriFormatException: 無効な URI: URI の形式を決定できませんでした。
    
[/code]

##### 参考サイト

API : <https://docs.joinmastodon.org/methods/apps/>  
ソースコード: <https://argius.hatenablog.jp/entry/20131113/1384352397>

##### ソースコード

[code]

            public static async Task<string> GetLastUrl(string url)
            {
                HttpClient client = new HttpClient();
                client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko");
    
                HttpResponseMessage response = await client.GetAsync(url);
                response.EnsureSuccessStatusCode();
    
                return response.RequestMessage.RequestUri.ToString();
            }
    
            private static async Task test_run()
            {
                //リダイレクトURLを設定
                //Console.WriteLine("あああ");
                Task<string> task = GetLastUrl("https://mstdn.jp/web/home");
                //Task<string> task = GetLastUrl("https://mstdn.jp/api/v1/apps");
                task.Wait();
    
                //パラメータを設定
                Dictionary<string, string> parameters = new Dictionary<string, string>()
                {
                    { "client_name", "test" },
                    { "redirect_uris", task.Result }
                };
                var para = new FormUrlEncodedContent(parameters);
                var tt = para.ReadAsStringAsync().Result;
    
                string url = "https://mstdn.jp/api/v1/apps?" + tt;
    
    
                string q = HttpUtility.UrlEncode(url);
    
    
                //Console.WriteLine("encoded q: " + q);
    
                // HTTPアクセス
                Console.WriteLine(url);
    
                var req = WebRequest.Create(q);
    
                Console.WriteLine("bbbbbb");
    
                req.Headers.Add("Accept-Language:ja,en-us;q=0.7,en;q=0.3");
                var res = req.GetResponse();
    
                // レスポンス(JSON)をオブジェクトに変換
                ServiceResult info;
                using (res)
                {
                    using (var resStream = res.GetResponseStream())
                    {
                        var serializer = new DataContractJsonSerializer(typeof(ServiceResult));
                        info = (ServiceResult)serializer.ReadObject(resStream);
                    }
                }
                
                Console.ReadKey();
            }
    
    
            private static async void test()
            {
                Task.WaitAll(test_run());
    
            }
    
            static void Main(string[] args)
            {
               // t();
    
                test();
    
    
    
            }
    
    
            [DataContract]
            public class ServiceResult
            {
    
                [DataMember]
                public string id { get; set; }
                [DataMember]
                public string name { get; set; }
    
            }
    
    
[/code]


CC BY-SA 4.0
2022-11-12T08:24:51.307
92182
2022-11-12T11:51:40.670
2022-11-12T09:23:28.027
55177
55177
question
c#
UriFormatException: 無効な URI: URI の形式を決定できませんでした。 の対処法方法が知りたい


UrlEncode するとエラーが発生しますね  
エンコードによってこんな文字列になっているからではないでしょうか

`https%3a%2f%2fmstdn.jp%2fapi%2fv1%2fapps%3fclient_name%3dtest%26redirect_uris%3dhttps%253A%252F%252Fmstdn.jp%252Fauth%252Fsign_in`

エンコードなし

[code]

    using System;
    using System.Net;
    
    public class Program
    {
        public static void Main()
        {
            WebRequest request = WebRequest.Create ("https://mstdn.jp/api/v1/apps?client_name=test&redirect_uris=https%3A%2F%2Fmstdn.jp%2Fauth%2Fsign_in");
            Console.Write(request);
        }
    }
    
[/code]

<https://dotnetfiddle.net/F54818>

エンコードあり

[code]

    using System;
    using System.Net;
    using System.Web;
    
    public class Program
    {
    
        public static void Main()
        {
             string encoded_uri = HttpUtility.UrlEncode("https://mstdn.jp/api/v1/apps?client_name=test&redirect_uris=https%3A%2F%2Fmstdn.jp%2Fauth%2Fsign_in");
            WebRequest request = WebRequest.Create (encoded_uri);
            Console.Write(request);
        }
    }
    
[/code]

<https://dotnetfiddle.net/F54818>


CC BY-SA 4.0
2022-11-12T11:51:40.670
92186
2022-11-12T11:51:40.670
15380
92182
answer