アクセス:私は、サーバー上の音楽プレーヤーを制御するためにWebApiApplicationを使用.NETのWebアピInvalidOperationExceptionがグローバルオブジェクト私が何をしようとしている
を(民主的な音楽プレーヤーの一種としてそれを想像:私のハウスメイトと私すべてスマートフォン経由でアクセスでき、同じ方法で制御できます)。
ウェブ呼び出しはこのように作られています:
http://localhost:64199/api/Music?category=Ambient&action=play
または
http://localhost:64199/api/Music?category=Ambient&action=next
私のコントローラは次のようになります。
public class MusicController : ApiController
{
const string MUSICPATH = @"...\Songs";
public HttpResponseMessage Get(string category, string action, string song = "", bool shuffle = false)
{
// DirMusicPlayer.Category = category;
DirMediaPlayer dmp = DirMediaPlayer.getInstance(category);
System.Diagnostics.Debug.WriteLine("Thread-ID (Ctrl): " + Thread.CurrentThread.ManagedThreadId);
switch (action)
{
case "play":
if (song.Equals(""))
{
dmp.PlayAll();
}
else
{
dmp.PlaySong(song);
}
break;
case "stop":
dmp.Stop();
break;
case "next":
dmp.PlayNext();
break;
case "prev":
dmp.PlayPrevious();
break;
case "shuffle":
dmp.Shuffle = shuffle;
break;
default:
break;
}
return Request.CreateResponse(HttpStatusCode.OK, "Playing");
}
}
プレイヤーは、特殊なシステムです。 Windows.Media.MediaP層として実装され、シングルトンとして実装されています。最初にGlobal.asaxでインスタンス化され、ランダムな曲から始まります。
後で(Web呼び出しを使用して)アクセスしようとするたびに、プレーヤが実行中のスレッドにアクセスできないため、アプリケーションがInvalidOperationExceptionでクラッシュします。
私はスレッドで何が起こるか考え出した:
- スレッドID(APPSTART):1 // Global.asaxのスレッド
- スレッドID(MediaPlayerの):1つの
- スレッド-ID(MusicController):スレッドプールから7は//コントローラインスタンス
- スレッドID(MediaPlayerの):7つの//クラッシュ、MediaPlayerのインスタンスがスレッドに属しているため、1
あなたが見てきたように、私は問題が何であるかを知っていますが、私が.NETを使い慣れていないので、解決方法はわかりません。私はプレーヤーをコントロールし、それらのApiControllersによって呼び出されるグローバルなユニークなコントローラのようなものが必要です。
私はこの質問が以前に尋ねられていないことを願っています。私はそれを調べようとしましたが、何を検索するのか正確には分かりませんでした。 MediaPlayerのはDispatcherObjectから継承し、それは述べている
私はこれまでどおり動作するとは思わない。 WepAPIは要求/応答システムです。それは、曲を演奏するのに十分な長さの接続を開いたままにするつもりはありません。あなたはWebAPIを使ってあなたのアプリにその曲を読み込んでそれを再生しますが、あなたはWebAPIからそれを再生しません。 –
私はWebApiが新しい呼び出しを待つことができるように、Web呼び出し後に特定の曲を再生するように頼まれていない別のアプリ(Windows Media Playerなど)が必要になりますか?ありがとう、スティーブン! – 19CMB94