jsmode "WebView2"側のWebSocketは残る?No.11399
こみやんま さん 23/05/25 17:03
 
現在利用してはいないのですが、以前提案したものに近いものとして
jsmode "WebView2"の WebSocketがあります。
fetchが封じされているのに、WebSocketは生き残っているようで、
これこのまま残るのかな? と疑問に思いました。
(jsmode側のfetchもlocalhost対象だと実行できるようにするのかな?)

----- test.mac ------
jsmode "WebView2";

js {
debuginfo(2);
let connection = new WebSocket("ws://localhost:12345");

connection.onopen = function(event) {
    console.log("通信接続イベント受信");
    console.log(event.data);
}

//エラー発生
connection.onerror = function(error) {
    console.log("エラー発生イベント受信");
    console.log(error.data);
};

//メッセージ受信
connection.onmessage = function(event) {
    console.log("メッセージ受信");
    console.log(event.data);
};

//切断
connection.onclose = function() {
    console.log("通信切断イベント受信");
};
}




----------- test.cs (ConsoleApp6.exe) -------------------

using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp6
{
    internal class Program
    {
        static async Task Run()
        {
            //Httpリスナーを立ち上げ、クライアントからの接続を待つ
            HttpListener s = new HttpListener();
            s.Prefixes.Add("http://localhost:12345/");
            s.Start();
            var hc = await s.GetContextAsync();

            //クライアントからのリクエストがWebSocketでない場合は処理を中断
            if (!hc.Request.IsWebSocketRequest)
            {
                //クライアント側にエラー(400)を返却し接続を閉じる
                hc.Response.StatusCode = 400;
                hc.Response.Close();
                return;
            }

            //WebSocketでレスポンスを返却
            var wsc = await hc.AcceptWebSocketAsync(null);
            var ws = wsc.WebSocket;

            //10回のレスポンスを返却
            for (int i = 0; i != 10; ++i)
            {
                //1回のレスポンスごとに2秒のウエイトを設定
                await Task.Delay(2000);

                //レスポンスのテストメッセージとして、現在時刻の文字列を取得
                var time = DateTime.Now.ToLongTimeString();

                //文字列をByte型に変換
                var buffer = Encoding.UTF8.GetBytes(time);
                var segment = new ArraySegment<byte>(buffer);

                //クライアント側に文字列を送信
                await ws.SendAsync(segment, WebSocketMessageType.Text,
                  true, CancellationToken.None);
            }

            //接続を閉じる
            await ws.CloseAsync(WebSocketCloseStatus.NormalClosure,
              "Done", CancellationToken.None);
        }

        static async Task Main(string[] args)
        {
            await Run();
        }
    }
}


[ ]
RE:11399 jsmode "WebView2"側のWebSocketNo.11400
秀丸担当 さん 23/05/25 17:32
 
WebSocketはあまり詳しくないですが、特に制約はしていないです。
というかfetchも特に明示的に封じてはいないです。

ローカルのfile: だと、なにかにつけてCORSでブロックされたりして困ったりします
が、たぶんその水準と同じことになるのだと思います。
普通のブラウザでfile: がCORSでブロックされるような状況でも、WebSocketが使え
るのなら、jsmodeでも使えるのだと思います。

もしもまずいことがあったら塞ぐ方策も考えるかもしれないです。

[ ]
RE:11400 jsmode "WebView2"側のWebSocketNo.11402
こみやんま さん 23/05/25 18:27
 
>WebSocketはあまり詳しくないですが、特に制約はしていないです。
>というかfetchも特に明示的に封じてはいないです。
>
>ローカルのfile: だと、なにかにつけてCORSでブロックされたりして困ったりしま
>すが、たぶんその水準と同じことになるのだと思います。
>普通のブラウザでfile: がCORSでブロックされるような状況でも、WebSocketが使え
>るのなら、jsmodeでも使えるのだと思います。

あれ、本当だ... むむ? どこで jsmode 側はネット関係遮断されてると思ったので
しょう...

fetchだろうがWebSocketだろうが、ブラウザ枠のみならず、
jsmode側とも普通に「相互」にdllとデータのやりとりやイベント駆動実行できるじ
ゃないですか。

色々とああだこうだと悩んでいたのはなんだったのだろう...

[ ]
RE:11402 jsmode "WebView2"側のWebSocketNo.11403
秀丸担当 さん 23/05/26 09:28
 
jsmode "WebView2";では、ブラウザ枠のようにアドレスを指定してコンテンツを読め
るようにはなっていないので、それのことかもしれないですね。
WebSocketが使えるということで、WebView2を使う利用価値の1つになるという気が
します。

[ ]