在windows phone 8应用程序中调用REST web服务时,值不在预期范围内



我已经纠结了几个小时了。当我调用我的一个web服务函数时,我一直得到"值不在预期范围内"。我正在使用一个POST方法,我正在传递一个json对象,并期望返回一些json数据。

它没有意义,因为我有其他web服务功能工作得很好,最烦人的是,当从Fiddler 2调用时,它工作得很好。

我在try/catch

中调用以下代码
string jsonResponse = await wc.UploadStringTaskAsync(new Uri(App.WebServiceUri + "/json/getdocumentbydocid"), jsonRequest);

我已经把断点在我的代码中,当从fiddler调用时,它进入特定的函数,但当通过代码调用时,它会产生异常"值不落在预期范围内",但它不会在try/catch

中捕获

它直接爆炸到

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs 

e)

可能它没有被try/catch捕获,因为我是从async函数调用它的:

public static Task<string> UploadStringTaskAsync(this WebClient wc, Uri url, string data)
{
    var tcs = new TaskCompletionSource<string>();
    wc.UploadStringCompleted += (s, e) =>
    {
        if (e.Error != null)
            tcs.TrySetException(e.Error);
        else if (e.Cancelled)
            tcs.TrySetCanceled();
        else
            tcs.TrySetResult(e.Result);
    };
    wc.UploadStringAsync(url, "POST", data);
    return tcs.Task;
}

但它仍然不能解释我的错误。我没有处理任何列表或类似的东西,所以我不得不再次假设它与uri相关,但这也不是!

当我在Application_UnhandledException中捕获错误并继续运行应用程序后,它实际上调用我的代码并返回适当的数据,但我的应用程序已经爆炸了。

这根本没有意义!json对象pass是一个简单的poco对象,它包含一个字符串(表名),一个长(docid)和一个int(页号),它返回一个poco对象,再次不包含列表或类似的,所以我不明白这个错误意味着什么,为什么它完美地工作在我的web服务中定义的所有其他函数。

任何想法?

谢谢。

更新:

这是我第二次修改这个答案!!我删除了我原来的那个,我以为我已经修好了,并提供了细节,但这不是正确的原因。

我受够了这个错误,但至少我在这个过程中学到了一些东西,但错误仍然没有意义,至少对我来说不是!

我认为这与狡猾的xaml有关,或者在从构造函数调用异步函数时没有延迟加载,但事实并非如此。

虽然我有可疑的代码,我很确定现在我已经清除了它,所有设置都如预期的那样,但我仍然得到错误。

我有一个需要在UserControl上的第三方控件。我的UserControl有一个单一的属性,即SourceFile类型的字符串

public string SourceFile
{
    get
    {
        return _sourceFile;
    }
    set
    {
        _sourceFile = value;
    }
}

这个属性被绑定到我的viewModel的一个属性,即DocumentUri

public string DocumentUri
{
    get { return this._documentUri; }
    set
    {
        if (this._documentUri != value)
        {
            this.SetProperty(ref this._documentUri, value);
        }
    }
}

SetProperty照顾INotifyPropertyChanged和我的事件处理程序肯定被设置。

下面是我的xaml代码:
<Grid Grid.Row="1">
    <StackPanel Orientation="Vertical">
        <cc:Viewer SourceFile="{Binding DocumentUri}" />
    </StackPanel>                        
 </Grid>

其中cc:Viewer是我的UserControl.

按上述设置时,我得到以下错误:"值不在预期范围内。"

如果我删除SourceFile="{Binding DocumentUri}",错误消失,但这是毫无意义的,因为我需要这个属性来显示我的文档,当它被下载。它只是确认它实际上链接到这个属性。

任何想法?

谢谢。

蒂埃里

我删除了原来的答案,因为我刚刚发现了导致问题的原因,这次我100%确定。

虽然我认为这可能与狡猾的xaml有关,或者在从构造函数调用异步函数时没有延迟加载,但这是多种因素的结合。

抛出的错误完全是误导!!这是由于多种原因造成的:

  1. 在不使用异步初始化模式的情况下从构造函数调用async。
  2. 不检查构造函数和属性中的值是否为空
  3. 在我的UserControl中创建一个没有绑定的属性。我只是创建了一个常规属性,而实际上我应该使用DepencyProperty创建一个属性,使其可绑定。

一旦以上都是正确的,我的问题就排序了。

最新更新