Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Getting result of a task
Message
General information
Forum:
ASP.NET
Category:
Common Language Runtime
Environment versions
Environment:
C# 5.0
OS:
Windows 10
Database:
MS SQL Server
Miscellaneous
Thread ID:
01643645
Message ID:
01644069
Views:
37
Rick,

Thanks a lot. It does look quite simple. I already finished with the HttpWebRequest implementation, so perhaps I'll leave it as is.

I'm just wondering about best practices - say, should I use static request object or instantiate new request every time to get result?

Here is my current method:
private string GetResponse(string json)
        {
            //request = WebRequest.Create(url) as HttpWebRequest;

            String responseString;
            request.Method = "Post";
            request.ContentType = "application/json;charset=UTF-8";
            Stream stream = request.GetRequestStream();
            byte[] buffer = Encoding.UTF8.GetBytes(json);
            stream.Write(buffer, 0, buffer.Length);

            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream responseStream = response.GetResponseStream();
                using (StreamReader sr = new StreamReader(responseStream))
                {
                    responseString = sr.ReadToEnd();
                }
            }
            else
            {
                throw new Exception(response.StatusDescription);
            }

            response.Close();
            return responseString;
        }

        private void SetRequestHeaders(string tcHost, string tcUserName, string tcPassword, int tnTimeout, string url)
        {
            String fullUrl = tcHost + '|' + url;
            fullUrl = Regex.Replace(fullUrl, @"(/*\|/*)", "/");
            request = WebRequest.Create(fullUrl) as HttpWebRequest;
      
            string authorizationKey = Convert.ToBase64String(
             System.Text.ASCIIEncoding.ASCII.GetBytes(
                 string.Format("{0}:{1}", tcUserName, tcPassword)));
            request.Headers.Add("Authorization", "Basic " + authorizationKey);
            request.Timeout = tnTimeout * 1000;
            HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
            request.CachePolicy = noCachePolicy;
        }
Now, I have another question.

I need to call this dll from VFP. I can do it using wwDotNetBridge but I am wondering if I can do it the same way as other dll is working.

The other dll function declaration is the following
declare integer InitializeConnection in "dllNameHere x86.dll" string, string
					lnInitializeCode = InitializeConnection(.cODBC_DSN, .cDatabase)
It uses the special attribute class
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace DllExport
{
    /// <summary>
    /// Attribute added to a static C# method to export it
    /// </summary>
    [AttributeUsage(AttributeTargets.Method)]
    public class DllExportAttribute : Attribute
    {
        private string m_exportName;
        private CallingConvention m_callingConvention;

        /// <summary>
        /// Constructor 1
        /// </summary>
        /// <param name="exportName"></param>
        public DllExportAttribute(string exportName)
            : this(exportName, System.Runtime.InteropServices.CallingConvention.StdCall)
        {
        }

        /// <summary>
        /// Constructor 2
        /// </summary>
        /// <param name="exportName"></param>
        /// <param name="callingConvention"></param>
        public DllExportAttribute(string exportName, CallingConvention callingConvention)
        {
            m_exportName = exportName;
            m_callingConvention = callingConvention;
        }

        /// <summary>
        /// Get the export name, or null to use the method name
        /// </summary>
        public string ExportName
        {
            get { return m_exportName; }
        }

        /// <summary>
        /// Get the calling convention
        /// </summary>
        public string CallingConvention
        {
            get
            {
                switch (m_callingConvention)
                {
                    case System.Runtime.InteropServices.CallingConvention.Cdecl:
                        return typeof(CallConvCdecl).FullName;

                    case System.Runtime.InteropServices.CallingConvention.FastCall:
                        return typeof(CallConvFastcall).FullName;

                    case System.Runtime.InteropServices.CallingConvention.StdCall:
                        return typeof(CallConvStdcall).FullName;

                    case System.Runtime.InteropServices.CallingConvention.ThisCall:
                        return typeof(CallConvThiscall).FullName;

                    case System.Runtime.InteropServices.CallingConvention.Winapi:
                        return typeof(CallConvStdcall).FullName;

                    default:
                        return "";
                }
            }
        }
    }
}
and it's added this way
 [DllExport("Test", System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static String Test(String dataSource, String initialCatalog)
        {
            return dataSource + ' ' + initialCatalog;
        }
So, I'm wondering if I should try making my class and methods static and use that same way.

Thanks in advance.



>The easiest way to use HttpWebRequest actually is to use WebClient() which is wrapper around it. Most operations are a single line although if you need to add authentication or headers it's a little more work.
>
>
>WebClient client = new WebClient();
>client.Headers.Set("Accept", "application/json");
>client.Headers.Set("Content-Type", "application/json");
>
>// this should handle basic auth
>client.Credentials = new NetworkCredential("username", "password");
>
>var resultJson = client.UploadString(url,json);
>
>
>
>Another even easier way is to use Westwind.Utilities and you can do something like this:
>
>
>       [TestMethod]
>        public void JsonRequestTest()
>        {
>            var settings = new HttpRequestSettings()
>            {
>                Url = "http://codepaste.net/recent?format=json",
>                Credentials = new NetworkCredential("username","Password")
>            };
>            var snippets = HttpUtils.JsonRequest<List<CodeSnippet>>(settings);
>
>            Assert.IsNotNull(snippets);
>            Assert.IsTrue(settings.ResponseStatusCode == System.Net.HttpStatusCode.OK);
>            Assert.IsTrue(snippets.Count > 0);
>            Console.WriteLine(snippets.Count);
>        }
>
>
>It handles the HTTP Call and JSON conversion for you in one shot.
>
>+++ Rick ---
>
>>Rick,
>>
>>I'm trying to find good examples of using HttpWebRequest.
>>
>>Say, I have the following method right now:
>>
>>
>>private void SetRequestHeaders(string tcHost, string tcUserName, string tcPassword, int tnTimeout)
>>        {
>>            request = WebRequest.Create(tcHost) as HttpWebRequest;
>>            request.Host = tcHost;
>>            request.Headers.Remove("Accept");
>>            request.Headers.Add("Accept", "application/json");
>>            string authorizationKey = Convert.ToBase64String(
>>             System.Text.ASCIIEncoding.ASCII.GetBytes(
>>                 string.Format("{0}:{1}", tcUserName, tcPassword)));
>>            request.Headers.Add("Authorization", "Basic " + authorizationKey);
>>            request.Timeout = tnTimeout * 1000;
>>        }
>>
>>This is the method I'd like to call before trying to get a response. The question is - my actual API url should be appened to the tcHost above. What should I do with the request variable above (assuming it's working - I haven't tested yet) to use the actual API url such as
>>
>>
>>"/integrationapi//Attraction/Tickets/Validate"
>>
>>Thanks in advance.
>>
>>
>>
>>>If you're sending HTTP request synchronously I'd highly recommend you **don't** use HttpClient. Using the `.Result` property causes many issues and if you use it on a Web site you are very likely to lock up the application eventually when simultaneous requests are active hitting the same code.
>>>
>>>I'd recommend you just use WebClient() or HttpWebRequst() for synchronous HTTP requests, or if you want to use HttpClient() make sure you use Async/Await which requires that your calling method is async. Depending on what you call this code from this may be very easy to accomplish (like in an MVC controller you can just add `async` to the controller method and return a task (public async Task<ActionResul> MyMethod()).
>>>
>>>Whatever you do - stay away from using .Result with Async methods especially in Web applications - there are lots of issues there.
>>>
>>>+++ Rick ---
>>>
>>>
>>>
>>>>Hi everybody,
>>>>
>>>>I've defined the following method:
>>>>
>>>>
>>>>static async Task<HttpResponseMessage> GetResponse(TicketUsageRequests ticket, string apiUrl)
>>>>        {
>>>>            HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl, ticket);
>>>>            //response.EnsureSuccessStatusCode();
>>>>            
>>>>            return response;
>>>>        }
>>>>
>>>>My question is - how can I get its result in the main method code and synchronously?
>>>>
>>>>My current method is:
>>>>
>>>>
>>>>try
>>>>            {               
>>>>                SetRequestHeaders(tcHost, tcUserName, tcPassword, tnTimeout, tnRetries);
>>>>
>>>>                TicketUsageRequests ticket = new TicketUsageRequests();
>>>>                ticket.TicketBarcode = tcBarcode;
>>>>                ticket.TicketUsageDate = tcUsageDate;
>>>>                ticket.UserID = tcUserName;
>>>>
>>>>               ... here I want to get the result of the response and parse it
>>>>
>>>>   ...
>>>>
>>>>
>>>>I found this
>>>>
>>>>http://stackoverflow.com/questions/5095183/how-would-i-run-an-async-taskt-method-synchronously
>>>>
>>>>and trying to figure out how to apply pixel's solution.
>>>>
>>>>Thanks in advance.
If it's not broken, fix it until it is.


My Blog
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform