Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpWebRequest in c# do not work with .net 4.5

i'm working on an c# project that send a xml to a server and receives a xml as response.
With .Net Framework 4.0 installed that works fine.
With .Net Framework 4.5 installed it throws this 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()`  

I use the method BeginGetResponse and all parameters there are not null.
Does anybody know what's wrong?
Why does it work with 4.0 but not with 4.5?
Did i forget something to set up?

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
In my Config File i use mostly the appsettings for individual settings. Like:
<add key="DATABASE_CONNECTION" value="FIREBIRD"/>

like image 847
user2621742 Avatar asked Aug 13 '13 08:08

user2621742


People also ask

What is HttpWebRequest?

The HttpWebRequest class provides support for the properties and methods defined in WebRequest and for additional properties and methods that enable the user to interact directly with servers using HTTP.

What is the difference between HttpWebRequest and WebRequest?

WebRequest is an abstract class. The HttpWebRequest class allows you to programmatically make web requests to the HTTP server.

Is HttpWebRequest obsolete?

WebRequest, WebClient, and ServicePoint are obsolete.


3 Answers

To be honest as you are now targeting .NET 4.5 I would have a look into using HttpClient instead of HttpWebRequest.

HttpClient

like image 101
Jammer Avatar answered Oct 17 '22 17:10

Jammer


Strange there wasn't a serious answer posted already...

HttpWebRequest has been made obsolete in .NET 4.5 and later versions so it will not compile which is noted on the msdn site

This is why Jammer is saying to use HttpClient as a replacement since it seems to be the replacement microsoft has made for it.

Looks like it will be an effort to change your code but I'd say it's all for the best

like image 6
user1567453 Avatar answered Oct 17 '22 18:10

user1567453


I had the same strange problem in IdnEquivalent. The problem persisted when I had Fiddler web debugger launched during my debug session. After I shut it down the problem disappeared.

like image 1
TechGeorgii Avatar answered Oct 17 '22 16:10

TechGeorgii