Это очень просто, запустите этот пример Silverlight4 с закомментированным свойством ContentType, и вы получите ответ от моего сервиса в xml.Теперь раскомментируйте свойство и запустите его, и вы получите исключение ProtocolViolationException. Служба возвращает данные в формате JSON.
#if DEBUG
Address = "http://localhost.:55437/Services/GetFoodDescriptionsLookup(2100)";
#else
Address = "http://stephenpattenconsulting.com/Services/GetFoodDescriptionsLookup(2100)";
#endif
Uri httpSite = new Uri(Address);
HttpWebRequest wreq =
(HttpWebRequest)WebRequestCreator.ClientHttp.Create(httpSite);
//wreq.ContentType = "application/json"; // Wrong
wreq.Accept = "application/json"; // Right
wreq.BeginGetResponse((cb) =>
{
HttpWebRequest rq = cb.AsyncState as HttpWebRequest;
HttpWebResponse resp = rq.EndGetResponse(cb) as HttpWebResponse; // Exception
StreamReader rdr = new StreamReader(resp.GetResponseStream());
string result = rdr.ReadToEnd();
rdr.Close();
}, wreq);
Новое исключение
System.NotSupportedException не было обработано пользователемкод Message = "" StackTrace: в System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, состояние объекта) в System.Net.Browser.BrowserHttpWebRequest.EndGetResponse (IAsyncResult asyncResult) в. com.web.Web 0 (IAsyncResult cb) в System.Net.Browser.BrowserHttpWebRequest. <> C _DisplayClassd.b__b (объект state2) в System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (состояние объекта) в объекте System.ThecutionThree(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение ignoreSyncCtx) в System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () в System.Threading.ThreadPoolWorkuetem.Threading. ThreadPoolWaitCallback.PerformWaitCallback () InnerException: System.NotSupportedException Message = указанный метод не поддерживается.StackTrace: в System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult) в System.Net.Browser.BrowserHttpWebRequest. <> C _DisplayClass5.b_ 4 (объект sendShelser для объекта).. <> c _DisplayClass2.b__0 (Object sendState) InnerException:
РАБОТАЕТ СЕЙЧАС
Исключение, которое я получаю, связано с хаком, который я использую дляполучите Fiddler, чтобы показать адаптер обратной петли, т.е. http://localhost.:55437/Services/GetFoodDescriptionsLookup(2100), обратите внимание на дополнительную точку после слова localhost.
Вот и все!
Я знаю, чтовсе думают, это можно было бы решить, я бы включил некоторые из этих деталей ... например, флаг отладки, который изменяет URI, я удалил большую часть кода, чтобы его было легче читать на SO, думая, что проблема была всетевой стек.Трудные уроки усвоены.
Спасибо всем, кто нашел время, чтобы заняться этим, как в stackoverflow, так и в автономном режиме.
Для полноты я добавил функцию jQuery, которая заставляла меня думать все это время, что мне нужно былоустановка «тип контента» вместо «принять» в приложении SL4.(ПРОЧИТАЙТЕ ДОКУМЕНТЫ!)
function CallService(serviceUrl, data, callback) {
$.ajax({
url: serviceUrl,
data: data,
dataType: 'json',
contextType: "application/json",
cache: false,
success: callback,
error: function (msg) {
alert("Request Failed!");
}
});
}