在C#Monodevelop

时间:2017-06-10 14:03:26

标签: c# .net rest ubuntu monodevelop

我试图做一个与API REST通信的桌面应用程序,然后我决定在我的xubuntu中使用MonoDevelop。我尝试使用构造函数从字符串创建一个Uri但是,当创建对象Uri时,它出现在我的MonoDevelop调试器中:

  

stationUri {System.Uri}
    System.Uri AbsolutePath System.NullReferenceException:Object   引用未设置为对象AbsoluteUri的实例     System.NullReferenceException:对象引用未设置为   对象的实例Authority System.NullReferenceException:   对象引用未设置为对象DnsSafeHost的实例     System.NullReferenceException:对象引用未设置为   对象的实例Fragment System.NullReferenceException:   对象引用未设置为对象主机的实例
    System.NullReferenceException:对象引用未设置为   对象的实例HostNameType System.NullReferenceException:   对象引用未设置为对象的实例

urlConParametros https://api.thingspeak.com/channels/***/fields/4.json?api_key=***&results=2字符串 出于安全原因,我没有显示完整的网址。

与此错误相关的相应代码:

public string GetResponse_GET(string url, Dictionary<string, string> parameters)
{
    try
    {
        //Concatenamos los parametros, OJO: antes del primero debe estar el caracter "?"
        string parametrosConcatenados = ConcatParams(parameters);
        string urlConParametros = url + "?" + parametrosConcatenados;
        string responseFromServer = null;
        Uri stationUri = new Uri(urlConParametros);
        if(!stationUri.IsWellFormedOriginalString())
        {
            System.Console.WriteLine("Url Vacía");
        }
        else
        {
            System.Net.HttpWebRequest wr = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(stationUri);
            wr.Method = "GET";

            wr.ContentType = "application/x-www-form-urlencoded";

            System.IO.Stream newStream;
            // Obtiene la respuesta
            System.Net.WebResponse response = wr.GetResponse();
            // Stream con el contenido recibido del servidor
            newStream = response.GetResponseStream();
            System.IO.StreamReader reader = new System.IO.StreamReader(newStream);
            // Leemos el contenido
            responseFromServer = reader.ReadToEnd();

            // Cerramos los streams
            reader.Close();
            newStream.Close();
            response.Close();
        }
        return responseFromServer;
    }
    catch (System.Web.HttpException ex)
    {
        if (ex.ErrorCode == 404)
            throw new Exception("Servicio Remoto No Encontrado: " + url);
        else throw ex;
    }
}

private string ConcatParams(Dictionary<string, string> parameters)
{
    bool FirstParam = true;
    string Parametros = null;

    if (parameters != null)
    {
        Parametros = "";
        foreach (KeyValuePair<string, string> param in parameters)
        {
            if(!FirstParam)
                Parametros+="&";
            Parametros+= param.Key + "=" + param.Value;
            FirstParam = false;
        }
    }

    return Parametros == null ? String.Empty : Parametros.ToString();
}

如果我完全运行代码,则抛出下一个stackTrace关联(我删除了敏感数据):

  

Gtk #callback委托中的异常     注意:应用程序可以使用GLib.ExceptionManager.UnhandledException来处理异常。   System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---&GT; System.NullReferenceException:未将对象引用设置为对象的实例     在System.Net.WebRequest.Create(System.Uri requestUri)[0x00000] in:0     在HomeWindow.GetResponse_GET(System.String url,System.Collections.Generic.Dictionary`2参数)[0x0002b] / home / / MonoDevelop Projects / / /MainWindow.cs:92     在MainWindow.showAct(System.Object sender,System.EventArgs e)[0x0003f] in / home / / MonoDevelop Projects / / /MainWindow.cs:34     at(wrapper managed-to-native)System.Reflection.MonoMethod:InternalInvoke(System.Reflection.MonoMethod,object,object [],System.Exception&amp;)     在System.Reflection.MonoMethod.Invoke(System.Object obj,BindingFlags invokeAttr,System.Reflection.Binder binder,System.Object [] parameters,System.Globalization.CultureInfo culture)[0x00038] in:0     ---内部异常堆栈跟踪结束---     在System.Reflection.MonoMethod.Invoke(System.Object obj,BindingFlags invokeAttr,System.Reflection.Binder binder,System.Object [] parameters,System.Globalization.CultureInfo culture)[0x00053] in:0     在System.Reflection.MethodBase.Invoke(System.Object obj,System.Object [] parameters)[0x00000] in:0     在System.Delegate.DynamicInvokeImpl(System.Object [] args)[0x0010d] in:0     在System.MulticastDelegate.DynamicInvokeImpl(System.Object [] args)[0x0000b] in:0     在System.Delegate.DynamicInvoke(System.Object [] args)[0x00000] in:0     at GLib.Signal.ClosureInvokedCB(System.Object o,GLib.ClosureInvokedArgs args)[0x00067] in:0     at GLib.SignalClosure.Invoke(GLib.ClosureInvokedArgs args)[0x0000c] in:0     在GLib.SignalClosure.MarshalCallback(IntPtr raw_closure,IntPtr return_val,UInt32 n_param_vals,IntPtr param_values,IntPtr invocation_hint,IntPtr marshal_data)[0x00086] in:0     at GLib.ExceptionManager.RaiseUnhandledException(System.Exception e,Boolean is_terminal)[0x00000] in:0     在GLib.SignalClosure.MarshalCallback(IntPtr raw_closure,IntPtr return_val,UInt32 n_param_vals,IntPtr param_values,IntPtr invocation_hint,IntPtr marshal_data)[0x00000] in:0     在Gtk.Application.gtk_main()[0x00000]中:0     在Gtk.Application.Run()[0x00000]中:0     at .MainClass.Main(System.String [] args)[0x00012] / home / / MonoDevelop Projects / / /Program.cs:13

我不知道为什么不能从字符串中正确建立Uri ...然后如果我传递错误的Uri来创建WebRequest也会抛出错误......

有谁知道我在这里做错了什么。

2 个答案:

答案 0 :(得分:0)

检查以确保查询字符串不包含任何不符合url的字符,否则您需要对其进行url编码。为避免必须自己编码,您可以在构建URL时使用UriBuilder

var uriBuilder = new UriBuilder(uri);
uriBuilder.Query = ConcatParams(parameters);
Uri stationUri = uriBuilder.Uri;
//if NOT well formed 
if(!stationUri.IsWellFormedOriginalString()) { //Note the `!` exclamation mark
    //...code removed for brevity
} else {
    //...code removed for brevity
}

它将根据需要对任何值进行url编码。

答案 1 :(得分:0)

非常感谢你的帮助,我解决了它复制cs文件并在monodevelop中创建一个空的proyect C#并将旧文件放入新项目并重新加载引用,然后新的Uri(字符串)工作......之前我创建项目为gtk#2.0,现在就像空的一样工作......我不知道原因......