我正在开发一个将 xml 发送到服务器并接收 xml 作为响应的 c# 项目。
安装 .Net Framework 4.0 后运行良好。
安装 .Net Framework 4.5 后会抛出此异常:
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei System.DomainNameHelper.IdnEquivalent(String hostname)
bei System.Uri.get_IdnHost()
bei System.Net.HttpWebRequest.GetSafeHostAndPort(Uri sourceUri, Boolean addDefaultPort, Boolean forcePunycode)
bei System.Net.HttpWebRequest.GenerateProxyRequestLine(Int32 headersSize)
bei System.Net.HttpWebRequest.SerializeHeaders()
bei System.Net.HttpWebRequest.EndSubmitRequest()
bei System.Net.HttpWebRequest.CheckDeferredCallDone(ConnectStream stream)
bei System.Net.HttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state)
bei Fahrzeugverwaltungsserver.OutsideWorld.MAN_Integrationsserver.RawCommunication.ISServer.doPostAndGet()`
我使用的方法BeginGetResponse
和所有参数都不为空。
有人知道出了什么问题吗?
为什么它适用于 4.0 但不适用于 4.5?
我忘记设置什么了吗?
编辑 1
private void doPostAndGet()
{
try
{
//caching
inform(SystemIcons.Information, Translations.ISServer_postAndGet_0);
Trace.TraceInformation("OUT:\n" + Beautify(InputXML));
string c = cache.Get(InputXML.OuterXml);
if (c != null)
{
XmlDocument docl = new XmlDocument();
docl.LoadXml(c);
inform(SystemIcons.Information, Translations.ISServer_postAndGet_1);
printInDocument(docl, "Aus Cache.");
this.doc = docl;
}
//Read access information:
UriBuilder urib = new UriBuilder("http", MANHaendlerdaten.IS_host, 9005, MANHaendlerdaten.IS_path);
urib.UserName = MANHaendlerdaten.IS_user;
urib.Password = MANHaendlerdaten.IS_password;
String proxyUser = MANHaendlerdaten.IS_proxy_user;
String proxyPassword = MANHaendlerdaten.IS_proxy_password;
// create credentials for request's header:
var proxy =
Convert.ToBase64String(
Encoding.UTF8.GetBytes(proxyUser + ":" + proxyPassword));
var user =
Convert.ToBase64String(
Encoding.UTF8.GetBytes(urib.UserName + ":" + urib.Password));
//set proxy when needed:
try
{
WebRequest.DefaultWebProxy = new WebProxy(MANHaendlerdaten.IS_proxy_ip, MANHaendlerdaten.IS_proxy_port);
if (WebRequest.DefaultWebProxy == null)
Trace.WriteLine(String.Format("WebRequest.DefaultWebProxy ist null. {0}, {1}", MANHaendlerdaten.IS_proxy_ip, MANHaendlerdaten.IS_proxy_port));
}
catch (Exception e)
{
Trace.TraceError("1\n" + e.ToString());
Debug.WriteLine(Translations.ISServer_postAndGet_3);
WebRequest.DefaultWebProxy = null; //speed up further request by avoiding proxy-auto-detect
//pass when no proxy specified
}
// System.Net.ServicePointManager.Expect100Continue = false //this is a nasty one if not set to false
client = (HttpWebRequest)WebRequest.Create(urib.Uri);
//Encodings:
client.Headers.Add("Accept-Encoding", "deflate");
client.ContentType = "text/xml; charset=UTF-8";
client.Accept = "text/xml; charset=UTF-8";
client.Headers.Add("SOAPAction", "\"\"");
//Authentification:
client.Headers.Add("Proxy-Authorization", "Basic " + proxy);
client.Headers.Add("Authorization", "Basic " + user);
//Connection and Protocol:
client.Host = urib.Host;
client.UserAgent = Translations.FullServiceName;
client.ProtocolVersion = HttpVersion.Version10;
client.KeepAlive = true;
client.Method = WebRequestMethods.Http.Post;
client.Timeout = 60000;
client.Proxy = new WebProxy(MANHaendlerdaten.IS_proxy_ip, MANHaendlerdaten.IS_proxy_port);
if (client.Proxy == null)
Trace.WriteLine(String.Format("client.Proxy ist null. {0}, {1}", MANHaendlerdaten.IS_proxy_ip, MANHaendlerdaten.IS_proxy_port));
client.ReadWriteTimeout = 60000;
//accept cookies within this ISServer-instance
if (this.cookieCont == null)
{
this.cookieCont = new CookieContainer();
}
client.CookieContainer = cookieCont;
inform(SystemIcons.Information, Translations.ISServer_postAndGet_7);
//Post request:
using (Stream to_request = client.GetRequestStream())
{
InputXML.Save(to_request);
to_request.Flush();
}
RequestState myRequestState = new RequestState();
myRequestState.request = client;
webrequestresponse = false;
IAsyncResult asyncResult = client.BeginGetResponse(new AsyncCallback(FinishWebRequest), myRequestState);
while (webrequestresponse == false)
{
Thread.Sleep(100);
}
}
catch (Exception e)
{
Trace.TraceError(e.ToString());
throw e;
}
}
编辑 2
在我的配置文件中,我主要使用 appsettings 进行个人设置。喜欢:
<add key="DATABASE_CONNECTION" value="FIREBIRD"/>