온라인 스트림에서 음악을 재생하는 백그라운드 오디오 에이전트를 작성하고 트랙 이름과 아티스트의 업데이트를 주기적으로 확인합니다. HttpWebRequest 객체를 사용하여 이름과 아티스트를 가져 오려고 시도하지만, HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result);
을 호출 할 때마다 아래 오류가 발생합니다. 그에 더HttpWebRequest가 null을 반환합니다. ResponseStatusCode
ResponseStatusCode = 'trackRequest.ResponseStatusCode' threw an exception of type 'System.NullReferenceException'
및 다음 trackRequest 객체로 더 파고
at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at AudioPlaybackAgent.AudioPlayer.TrackCallback(IAsyncResult result)
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()
, 나는이 문제를 찾을 수 :
A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll
WebException이에 대한 스택 추적은 다음과 같다 , 나는 이것을 발견한다 :
at System.Net.HttpWebRequest.get_ResponseStatusCode()
at AudioPlaybackAgent.AudioPlayer.TrackCallback(IAsyncResult result)
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()
다음은 현재 사용중인 코드입니다. TrackTimerTick 함수는 Timer에 의해 매 20 초마다 호출됩니다.
public static void TrackTimerTick(object state) {
try {
if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing) {
// Create a HttpWebrequest object to the desired URL.
HttpWebRequest trackRequest = (HttpWebRequest)HttpWebRequest.Create("<track/artist url");
// Start the asynchronous request.
IAsyncResult result = (IAsyncResult)trackRequest.BeginGetResponse(new AsyncCallback(TrackCallback), trackRequest);
}
} catch (WebException e) {
Debug.WriteLine(e.Message);
} catch (Exception e) {
Debug.WriteLine(e.Message);
}
}
public static void TrackCallback(IAsyncResult result) {
// State of request is asynchronous.
HttpWebRequest trackRequest = (HttpWebRequest)result.AsyncState;
HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result); // WebException thrown here
using (StreamReader httpwebStreamReader = new StreamReader(trackResponse.GetResponseStream())) {
string results = httpwebStreamReader.ReadToEnd();
XDocument trackXml = XDocument.Load(results);
string title = (from t in trackXml.Descendants("channel") select t.Element("title").Value).First<string>();
string artist = (from t in trackXml.Descendants("channel") select t.Element("artist").Value).First<string>();
if (BackgroundAudioPlayer.Instance.Track != null) {
AudioTrack track = BackgroundAudioPlayer.Instance.Track;
track.BeginEdit();
track.Title = title;
track.Artist = artist;
track.EndEdit();
}
}
trackResponse.Close();
}
누구든지이 문제를 해결할 수 있습니까? 미리 감사드립니다.
두 스레드에서 응답 상태에 액세스하지 않는 것입니까? – Cameron
TrackCallback이 응답을 참조하는 유일한 장소이기 때문에 저는 그렇게 믿지 않습니다. – bfink