我试图做一个与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
也会抛出错误......
有谁知道我在这里做错了什么。
答案 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,现在就像空的一样工作......我不知道原因......