HttpWebRequest en c# ne fonctionne pas avec .net 4.5
je suis en train de travailler sur un projet c# que d'envoyer un fichier xml sur un serveur et reçoit un xml comme réponse.
Avec .Net Framework 4.0 est installé, ce qui fonctionne parfaitement.
Avec .Net Framework 4.5 est installé, il jette cette Exception:
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()`
J'utilise la méthode BeginGetResponse
et de tous les paramètres, il n'y a pas la valeur null.
Quelqu'un sait quel est le problème?
Pourquoi faut-il travailler avec 4.0, mais pas avec 4.5?
Ai-je oublié quelque chose à configurer?
Edit 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;
}
}
Edit 2
Dans mon Fichier de Config j'utilise principalement le appsettings pour les réglages individuels. Comme:
<add key="DATABASE_CONNECTION" value="FIREBIRD"/>
Pouvez-vous nous montrer votre .Fichier de Config?
Pas sûr de savoir comment cela fonctionnait .net 4. Pouvez-vous essayer à l'aide de GetResponse() au lieu de BeginGetRespone?
Vous avez un
NullReferenceException
à System.DomainNameHelper.IdnEquivalent(String hostname)
. Voir aussi Comment faire HttpClient trafic de relais apparaître dans Fidder ou Charles?. Cela se produit dès que vous mettez à jour .NET 4 .NET 4.5, ou est-il une autre machine qui a un proxy?Il arrive quand je l'ai mise à jour de la .Net Framework sur le PC sur lequel mon programme s'exécute. Lorsque la version 4.0 est installé, il fonctionne très bien.
OriginalL'auteur user2621742 | 2013-08-13
Vous devez vous connecter pour publier un commentaire.
Pour être honnête que vous êtes en train de cibler .NET 4.5, j'aurais un coup d'oeil dans l'aide
HttpClient
au lieu de HttpWebRequest.HttpClient
Na pas faire le downvote - ce n'est pas vraiment une réponse à sa question, juste une recommandation d'utiliser quelque chose d'autre, de telles choses devraient être un commentaire ou une note de côté d'une vraie réponse.
Je considère que de bons conseils sur les options alternatives, certainement qualifier comme une réponse. HttpClient est la nouvelle recommandé de consommer les ressources HTTP ... comment est-ce PAS une réponse?
Certaines personnes sont trop pointilleux sur ce site ...
Pour le rendre clair était juste mon avis sur cette question. Je n'étais pas le gars qui downvoted, crois seulement que quand le mec na pas de fournir un commentaire concernant le downvote, en premier lieu, il ne le sera jamais. Il ne peut pas être considéré comme une réponse, car il ne marche pas fournir une réponse seulement une alternative à le faire - ses comme si quelqu'un vous demande "Hey pourquoi mon apple mauvais goût?" et vous répondez "Manger bannans." Son tout simplement pas de réponse directe, mais une solution à son problème si votre apple mauvais goût, il suffit de manger quelque chose d'autre, donc si vous avez un problème avec HttpWebRequest suffit d'utiliser HttpClient.
OriginalL'auteur Jammer
Étrange, il n'y avait pas une réponse sérieuse posté déjà...
HttpWebRequest a été rendu obsolète .NET 4.5 et versions ultérieures afin de ne pas compiler ce qui est noté sur la site msdn
C'est pourquoi Brouilleur est de dire d'utiliser HttpClient comme un remplacement, car il semble être le remplacement de microsoft a fait pour elle.
Dirait qu'il aura un effort pour modifier votre code, mais je dirais que c'est pour le mieux
OriginalL'auteur user1567453
J'ai eu le même problème étrange dans IdnEquivalent. Le problème a persisté quand j'ai eu Fiddler web débogueur lancé lors de ma session de débogage. Après que j'ai fermé le problème a disparu.
OriginalL'auteur George
Comme mentionné précédemment, HttpWebRequest est aujourd'hui obsolète. Avez-vous essayé HttpRequest? Trouvé ici: https://msdn.microsoft.com/en-us/library/system.web.httprequest(v=vs. 110).aspx
OriginalL'auteur Blairg23