使用HttpWebRequest从Silverlight应用程序调用WCF时出错

使用HttpWebRequest从Silverlight应用程序调用WCF时出错,silverlight,wcf,web-services,json,httpwebrequest,Silverlight,Wcf,Web Services,Json,Httpwebrequest,我试图从Silverlight应用程序调用返回JSON的WCF服务。它只是返回一个整数。我使用Fiddler验证它从未调用我的Web服务。我收到一个错误,上面写着“由于对象的当前状态,操作无效。”它发生在HttpWebResponse=(HttpWebResponse)\u webRequest.EndGetResponse(result)行上;如果需要,可以提供Stacktrace public MainPage() { InitializeComponent();

我试图从Silverlight应用程序调用返回JSON的WCF服务。它只是返回一个整数。我使用Fiddler验证它从未调用我的Web服务。我收到一个错误,上面写着“由于对象的当前状态,操作无效。”它发生在HttpWebResponse=(HttpWebResponse)\u 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未经用户代码处理。我相信这意味着我应该使用try-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()
位于System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,对象状态)
位于System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
在FuelizerGuage.MainPage.FinishWebRequest上(IAsyncResult结果)
在System.Net.Browser.BrowserHttpWebRequest.c__DisplayClassd.b__b(对象状态2)中
位于System.Threading.QueueUserWorkItemCallback.WaitCallback_上下文(对象状态)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔ignoreSyncCtx)
位于System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()处
在System.Threading.ThreadPoolWorkQueue.Dispatch()中
在System.Threading.\u ThreadPoolWaitCallback.PerformWaitCallback()中
同样根据Fiddler的说法,我的silverlight应用程序现在正在调用我的Web服务域,查找clientaccesspolicy.xml,然后查找crossdomain.xml,两者都不存在。

“GET”请求不能有内容类型头(它们不能有内容)。Silverlight中的HttpWebRequest实现比桌面框架中的更严格。尝试删除定义该属性的ling,它应该可以工作

更新:您的应用程序遇到了跨域问题。为了防止某些类型的跨域攻击,SL要求任何前往SL应用程序(即.xap文件)发源地以外的域的请求都必须遵守跨域策略-默认情况下不允许这些请求。有关这方面的更多信息,请访问


要解决此问题,您必须在服务中添加一个跨域策略,以允许SL应用程序使用它。

我注释掉了设置ContentType的行,现在出现了另一个错误。这是在System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)的System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,对象状态)中出现错误的堆栈跟踪的顶部。此外,请求仍然没有发送到我的Web服务。费德勒仍然没有接到电话的迹象。新错误发生在HttpWebResponse=(HttpWebResponse)\u webRequest.EndGetResponse(结果)上;线路。谢谢你的回复!我发现用户代码未处理SecurityException。我假设我需要某种catch语句,但我不知道要捕获什么类型的异常。我将发布一篇更新文章,其中包括我的错误截图和堆栈跟踪的副本。我还注意到它现在正在给我的Web服务的域打电话,寻找accesspolicy.xml谢谢,跨域问题是我的问题。