gpt4 book ai didi

c# - c# 中的 HttpWebRequest 不适用于 .net 4.5

转载 作者:太空狗 更新时间:2023-10-29 22:14:00 25 4
gpt4 key购买 nike

我正在开发一个将 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"/>

最佳答案

老实说,因为您现在的目标是 .NET 4.5,所以我会考虑使用 HttpClient 而不是 HttpWebRequest。

HttpClient

关于c# - c# 中的 HttpWebRequest 不适用于 .net 4.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18203835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com