Ошибка при вызове WCF из приложения Silverlight с использованием HttpWebRequest - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь позвонить из приложения Silverlight в службу WCF, возвращая JSON.Это просто возвращает целое число.Я использовал Fiddler, чтобы убедиться, что он никогда не звонит моему веб-сервису.Я получаю сообщение об ошибке «Операция недопустима из-за текущего состояния объекта».Это происходит в строке, HttpWebResponse response = (HttpWebResponse) _webRequest.EndGetResponse (result);Stacktrace может быть предоставлена ​​при необходимости.

public MainPage()
    {
        InitializeComponent();

        StartWebRequest();
    }

    void StartWebRequest()
    {
        HttpWebRequest _webRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://www.example.com/MyJSON.svc/onlineusercount"));

        _webRequest.ContentType = "text/json";
        _webRequest.Method = "GET";
        _webRequest.BeginGetResponse(FinishWebRequest, _webRequest);
    }

    void FinishWebRequest(IAsyncResult result)
    {
        HttpWebRequest _webRequest = (HttpWebRequest)result.AsyncState;

        HttpWebResponse response = (HttpWebResponse)_webRequest.EndGetResponse(result);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        needle.Value = Convert.ToInt32(responseString);

        // Close the stream object
        streamResponse.Close();
        streamRead.Close();

        // Release the HttpWebResponse
        response.Close();
    }
}

ОБНОВЛЕНИЕ: Я прокомментировал строку выше, которая говорит

_webRequest.ContentType = "text/json";

Моя новая ошибка говорит: SecurityException не обработанокод пользователя.Я считаю, что это означает, что я должен использовать попытку catch, но я не уверен, какой тип исключения нужно перехватить.

Мой след стека выглядит следующим образом:

at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at FuelizerGuage.MainPage.FinishWebRequest(IAsyncResult result)
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassd.<InvokeGetResponseCallback>b__b(Object state2)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Также согласно Fiddler,мое приложение silverlight теперь обращается к моему домену веб-службы в поисках clientaccesspolicy.xml, а затем ищет файл crossdomain.xml, ни один из которых не существует.

1 Ответ

0 голосов
/ 15 августа 2011

Запросы «GET» не могут иметь заголовок Content-Type (они не могут иметь содержимое). Реализация HttpWebRequest в Silverlight является более строгой, чем в настольной среде. Попробуйте удалить лин, который определяет это свойство, и оно должно работать.

Обновление : вы столкнулись с проблемой междоменных в вашем приложении. Чтобы предотвратить некоторые виды междоменных атак, SL требует, чтобы любые запросы, поступающие в домен, отличный от того, в котором возникла заявка SL (файл .xap), подлежали междоменной политике по умолчанию они запрещены. Вы можете найти больше информации об этом в http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx.

Чтобы решить эту проблему, вам, по сути, придется добавить к своей службе междоменную политику, чтобы приложения SL могли ее использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...