Getting Http Error Code 411 : Length Required - c#

When I am trying to upload a file using following code I am receiving Length Required error. Please note that if I am uploading a TEXT file then I don't see any issues. But when I upload WORD or PDF I am seeing the error. FYI, I am able to see to Content-Length in my request header in both occasions. Any help would be much appreciated.
internal static class CreateFile
{
private static string _Server = "MyServer.com";
private static string _Database = "ACTIVE";
internal static async Task<string> CreateFileInFolder(string _AuthToken, string _FolderId, string _FileLocation)
{
// Force TLS 1.2 instead of the default value.
ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
//folder creation URI
string _FileCreateUri = $"https://{_Server}/api/v2/customers/1/libraries/{_Database}/folders/{_FolderId}/documents";
FileInfo _FileDetails = new (_FileLocation);
string _Result = "";
FileRoot _FileRoot = new()
{
doc_profile = new FileProfile()
{
author = "ADMIN",
comment = "New Import",
default_security = "private",
name = _FileDetails.Name,
custom1 = "Test",
custom2 = "Test",
custom17 = "12345",
access = "full_access",
database = _Database,
size = _FileDetails.Length,
#class = "DOC",
type = "ACROBAT",
type_description = "",
wstype = "document"
},
audit = new FileAudit()
{
comments = "Test Import"
},
keep_locked = false,
warnings_for_required_and_disabled_fields = true
};
byte[] _FileBytes = File.ReadAllBytes(_FileDetails.FullName);
string _Boundary = $"----------{DateTime.Now.Ticks:x}";
MultipartFormDataContent _MultipartFormDataContent = new(_Boundary)
{
{
JsonContent.Create(_FileRoot), "profile"
},
{
new StreamContent(new MemoryStream(_FileBytes), _FileBytes.Length), "file"
}
};
_MultipartFormDataContent.Headers.Remove("Content-Type");
_MultipartFormDataContent.Headers.TryAddWithoutValidation("Content-Type", $"multipart/form-data; boundary={_Boundary}");
using (HttpClient _HttpClient = new())
{
//include authentication token in request header
_HttpClient.DefaultRequestHeaders.Add("X-Auth-Token", _AuthToken);
using (HttpResponseMessage _HttpResMsg = await _HttpClient.PostAsync(_FileCreateUri, _MultipartFormDataContent))
{
if (_HttpResMsg.StatusCode == HttpStatusCode.Created)
{
_Result = _HttpResMsg.Content.ReadAsStringAsync().Result;
}
}
}
//MessageBox.Show($"Json profile newly created folder: {_HttpResMsg.Content.ReadAsStringAsync().Result}", "New Folder Profile", MessageBoxButton.OK);
return _Result;
}
public class FileAudit
{
public string comments { get; set; }
}
public class FileProfile
{
public string author { get; set; }
public string access { get; set; }
public string comment { get; set; }
public string #class { get; set; }
public string database { get; set; }
public string default_security { get; set; }
public string name { get; set; }
public long size { get; set; }
public string type { get; set; }
public string type_description { get; set; }
public string wstype { get; set; }
public string custom1 { get; set; }
public string custom2 { get; set; }
public string custom17 { get; set; }
}
public class FileRoot
{
public FileProfile doc_profile { get; set; }
public FileAudit audit { get; set; }
public bool keep_locked { get; set; }
public bool warnings_for_required_and_disabled_fields { get; set; }
}
}
Tried to use HttpRequestMessage by setting Content-Length but again able to upload TEXT files but not WORD or PDF files.

Related

Reading and writting on appsettings.json

I am trying to read and write a value on appsettings.json.It is called Refreshed_Token. I have found something on internet and it was very well explained as an example but i get only one error. Can you please guys help me thank you very much.
Worker.cs
public async Task request_refresh_token()
{
var client = new RestClient("https://accounts.zoho.eu/oauth/v2/token?grant_type=authorization_code&client_id=" +_config.Value.Zoho_Client_Id+ "&client_secret=" +_config.Value.Zoho_Client_Secret+ "&code=" +_config.Value.Zoho_Code);
var request = new RestRequest();
request.AddHeader("Cookie", "xxx; xxx; iamcsr=xxx");
RestResponse response = await client.PostAsync(request);
var result = JObject.Parse(response.Content);
var refresh_token = result["refresh_token"].Value<string>();
update_appsettings_json(refresh_token);
}
public void update_appsettings_json(string refresh_token)
{
var appSettingsPath = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "appsettings.json");
var json = File.ReadAllText(appSettingsPath);
var jsonSettings = new JsonSerializerSettings();
jsonSettings.Converters.Add(new ExpandoObjectConverter());
jsonSettings.Converters.Add(new StringEnumConverter());
dynamic config = JsonConvert.DeserializeObject<System.Dynamic.ExpandoObject>(json, jsonSettings);
config.Config.Zoho_Code = Zoho_Refreshed_Token.refresh_token;
var newJson = JsonConvert.SerializeObject(config, Formatting.Indented, jsonSettings);
File.WriteAllText(appSettingsPath, newJson);
}
appsetting.json file :
{
"Config": {
"LeadCustomerId": "4096",
"URL": "example.com",
"Token": "xxx",
"Contact_Custom_Id": "11249",
"Opportunity_Custom_Id": "11261",
"Account_Custom_Id": "13397",
"Task_Custom_Id": "16876",
"Call_Custom_Id": "17033",
"Meeting_Custom_Id": "17098",
"Zoho_Client_Id": "xxx",
"Zoho_Client_Secret": "xxx",
"Zoho_Code": "xxx",
"Zoho_Refreshed_Token": ""
}
}
Config.cd file is:
public class Config
{
public string LeadCustomerId { get; set; }
public string WeclappURL { get; set; }
public string Weclapp_Token { get; set; }
public string Contact_Custom_Id { get; set; }
public string Opportunity_Custom_Id { get; set; }
public string Account_Custom_Id { get; set; }
public string Task_Custom_Id { get; set; }
public string Call_Custom_Id { get; set; }
public string Meeting_Custom_Id { get; set; }
public string Zoho_Client_Id { get; set; }
public string Zoho_Client_Secret { get; set; }
public string Zoho_Code { get; set; }
public string Zoho_Refreshed_Token { get; set; }
}
The error i get is this: The Zoho_Refreshed_Token does not exist in the current context
Thank you for your time!

Deserialization not filling my variables/response.data shows null

I want to put the jsonBody I get from the Rest API into this class construction.
Console.WriteLine(response.Data);
Somehow it only returns null.
This my whole code:
RestClient client = new RestClient("https://euterpe.webuntis.com/WebUntis/jsonrpc.do?school=HTL-Perg");
public void login()
{
var request = new RestRequest(Method.POST);
request.AddHeader("Content-type", "application/jason");
request.AddJsonBody(new
{
id = "ID",
method = "authenticate",
#params = new
{
user = "kung",
password = "foo",
client = "CLIENT"
},
jsonrpc = "2.0"
});
var response = this.client.Execute<AuthenticationResponse>(request);
Console.WriteLine(response.Data);
}
The request is working and I get the following return of the Rest API:
{
"jsonrpc":"2.0",
"id":"ID",
"result": {
"sessionId":"A173BECFB75F66123D6B678BE9745A29",
"personType":5,
"personId":1234,
"klasseId":123
}
}
Finally this are the two classes the response should get stored to, but the variables seem to stay empty:
public class AuthenticationResponse
{
[DeserializeAs(Name = "jsonrpc")]
public String Jsonrpc { get; set; }
[DeserializeAs(Name = "id")]
public int id { get; set; }
[DeserializeAs(Name = "result", Content=true)]
AuthenticationResult res { get; set; }
}
public class AuthenticationResult
{
[DeserializeAs(Name = "sessionId")]
string sessionId { get; set; }
[DeserializeAs(Name = "personType")]
int personType { get; set; }
[DeserializeAs(Name = "personId")]
int personId { get; set; }
[DeserializeAs(Name = "klasseId")]
int klasseId { get; set; }
}
Thanks for every advice.
I have taken a look at your code and tried it with WebUntis. Here is a working example as a console app. Especially important is the call to client.AddHandler Hope it helps solving your problem.
using RestSharp;
using RestSharp.Deserializers;
using System;
using System.Text;
namespace ConsoleApp3
{
internal class Program
{
private static RestClient client = new RestClient("https://euterpe.webuntis.com/WebUntis/jsonrpc.do?school=HTL-Perg");
public class AuthenticationResponse
{
[DeserializeAs(Name = "id")]
public string id { get; set; }
[DeserializeAs(Name = "result", Content = true)]
public AuthenticationResult result { get; set; }
}
public class AuthenticationResult
{
[DeserializeAs(Name = "sessionId")]
public string sessionId { get; set; }
[DeserializeAs(Name = "personType")]
public int personType { get; set; }
[DeserializeAs(Name = "personId")]
public int personId { get; set; }
[DeserializeAs(Name = "klasseId")]
public int klasseId { get; set; }
}
private static void Main(string[] args)
{
client.AddHandler(new JsonDeserializer(), "application/json-rpc");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-type", "application/json");
request.AddJsonBody(new
{
id = "ID",
method = "authenticate",
#params = new
{
user = "kung",
password = "foo",
client = "CLIENT"
},
jsonrpc = "2.0"
});
var response = client.Execute<AuthenticationResponse>(request);
var resp = Encoding.UTF8.GetString(response.RawBytes, 0, (int)response.ContentLength);
Console.WriteLine(response.Data);
}
}
}
Greetings,
Rainer.
Your AuthenticationResponse possibly needs to be
public class AuthenticationResponse
{
[DeserializeAs(Name = "id")]
public string id { get; set; }
[DeserializeAs(Name = "result")]
AuthenticationResult res { get; set; }
public string jsonrpc { get; set; } // Can remove if you dont need it.
}
Update
Based on your comment that this didn't work, please try to use Newtonsoft.Json to deserialize your result.
var response = client.Execute(request);
var deserialized = JsonConvert.DeserializeObject<AuthenticationResponse>(response.Content);
You would have to use JsonPropertyAttribute instead of DeserliazeAs in your class definition.
public class AuthenticationResponse
{
[JsonProperty("id")]
public string id { get; set; }
[JsonProperty("result")]
AuthenticationResult res { get; set; }
}
public class AuthenticationResult
{
[JsonProperty("sessionId")]
string sessionId { get; set; }
[JsonProperty("personType")]
int personType { get; set; }
[JsonProperty("personId")]
int personId { get; set; }
[JsonProperty("klasseId")]
int klasseId { get; set; }
}
Additional Option
You could also use RestSharp.Newtonsoft.Json which makes Newtonsoft.Json default serializer for RestSharp (and skipping the intermediate step).
In your Json there is nothing called "res" that is being returned .
This should fix your issue :
public class AuthenticationResponse
{
[DeserializeAs(Name = "jsonrpc")]
public String Jsonrpc {get;set;}
[DeserializeAs(Name = "id")]
public int Id { get; set; }
[DeserializeAs(Name = "result")]
AuthenticationResult Result { get; set; }
}

.net Core 2.0 Web API - Newtonsoft.Json.JsonSerializationException - IQueryable

I have two separate .net core applications, Web API and client. I get the model using:
public IEnumerable<OhaMedication> GetOhaMedication()
{
return _context.OhaMedication;
}
The model:
public class OhaMedication
{
public int OhaMedicationId { get; set; }
public string Phn { get; set; }
public int OhaTypeId { get; set; }
public int FrequencyId { get; set; }
public MedFrequancy Frequency { get; set; }
public OhaType OhaType { get; set; }
}
public class OhaType
{
public OhaType()
{
OhaMedication = new HashSet<OhaMedication>();
}
public int OhaTypeId { get; set; }
public string Name { get; set; }
public ICollection<OhaMedication> OhaMedication { get; set; }
}
public class MedFrequancy
{
public MedFrequancy()
{
OhaMedication = new HashSet<OhaMedication>();
}
public int FrequencyId { get; set; }
public string Frequency { get; set; }
public ICollection<OhaMedication> OhaMedication { get; set; }
}
In the client I use the following to get the data:
public IQueryable<OhaMedication> GetohaMedication()
{
var dir = _session.GetString(SessionsKeys.Directory);
bool connection = InternetConnection.Check(_webApiData.WebApiitems.Url);
if (connection)
{
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(_webApiData.WebApiitems.Url);
MediaTypeWithQualityHeaderValue contentType =
new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(contentType);
HttpResponseMessage response = client.GetAsync("/OhaMedications").Result;
string stringData = response.Content.ReadAsStringAsync().Result;
IQueryable<OhaMedication> data = JsonConvert.DeserializeObject<IQueryable<OhaMedication>>(stringData);
return data;
}
}
else
return _context.OhaMedication;
}
I need to use IQueryable to use include as follows:
var ohaMed = GetohaMedication().Where(x => x.Phn == phn).Include(o => o.Frequency)
.Include(o => o.OhaType).ToList();
I get the following error:
Newtonsoft.Json.JsonSerializationException: 'Cannot create and populate list
type System.Linq.IQueryable`1[WebUI.Data.DataModels.OhaMedication].
Path '', line 1, position 1.'
It cannot create an interface because doesnot know which type it actually should use.
Try:
JsonConvert.DeserializeObject<List<OhaMedication>>(stringData).AsQueryable()

Sending email through http with LinkedResource property

I am trying to compose a email that has a body with a embedded image using LinkedResource. When I try to Post it to our api that connects to the smtp I get this exception:
System.AggregateException: InvalidOperationException: Timeouts are not supported on this stream.
JsonSerializationException: Error getting value 'ReadTimeout' on 'System.IO.FileStream'.
This is my code what do I need to change to make this work.
class Program
{
static void Main(string[] args)
{
Mailer();
}
public static void Mailer()
{
var imageOne = new LinkedResource("PumpkinSpice.jpg", "image/jpeg");
imageOne.ContentId = "psl";
var imageLink = $"<img src=\"cid:{imageOne.ContentId}\"/>";
var listOfResources = new List<LinkedResource> {imageOne};
var email = new MailInfo()
{
ToAddresses = "mcjibbles#foo.com",
CcAddresses = "jibbles#bar.com",
BccAddresses = null,
Subject = "test email",
Body = "Email body" + imageLink,
Resources = listOfResources,
IsHtml = true
};
using (var client = CreateClient())
{
client.PostAsJsonAsync($"api/email", email).Wait();
}
}
private static HttpClient CreateClient()
{
return new HttpClient(new HttpClientHandler { UseDefaultCredentials = true })
{
BaseAddress = new Uri("http://fakesite.com/")
};
}
}
class MailInfo
{
public string ToAddresses { get; set; }
public string CcAddresses { get; set; }
public string BccAddresses { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public bool IsHtml { get; set; }
public List<LinkedResource> Resources { get; set; }
}
Api Code
public class EmailController : ApiController
{
[HttpPost]
public void SendEmail(EmailInformation information)
{
using (var message = new MailMessage())
{
message.Subject = information.Subject;
var toAddresses = SplitAddresses(information.ToAddresses);
foreach (var address in toAddresses)
{
message.To.Add(new MailAddress(address));
}
message.IsBodyHtml = information.IsHtml;
message.Body = information.Body;
using (var htmlView = AlternateView.CreateAlternateViewFromString(message.Body, null, "text/html"))
{
foreach (var resource in information.Resources)
{
htmlView.LinkedResources.Add(resource);
}
using (var client = new SmtpClient(WebConfigurationManager.AppSettings["Smtp"]))
{
message.From = information.FromAddress;
client.Send(message);
}
}
}
}
public class EmailInformation
{
public string ToAddresses { get; set; }
public string FromAddress { get; set; }
public string CcAddresses { get; set; }
public string BccAddresses { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public bool IsHtml { get; set; }
public List<LinkedResource> Resources { get; set; }
}
}

Read Json from file and display [duplicate]

This question already has answers here:
Android app Json
(2 answers)
Closed 7 years ago.
I writing android app and have API
Writing API to file like this
Code of writing:
string url2 = "http://new.murakami.ua/?mkapi=getProducts";
JsonValue json = await FetchAsync(url2);
string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
string filename = System.IO.Path.Combine(path, "myfile.txt");
using (var streamWriter = new StreamWriter(filename, true))
{
streamWriter.Write(json.ToString());
streamWriter.Close();
}
ParseAndDisplay1(json);
ParseAndDisplay2(json);
ParseAndDisplay3(json);
ParseAndDisplay4(json);
ParseAndDisplay5(json);
ParseAndDisplay6(json);
ParseAndDisplay7(json);
ParseAndDisplay8(json);
}
private async Task<JsonValue> FetchAsync(string url)
{
// Create an HTTP web request using the URL:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
request.ContentType = "application/json";
request.Method = "GET";
// Send the request to the server and wait for the response:
using (WebResponse response = await request.GetResponseAsync())
{
// Get a stream representation of the HTTP web response:
using (Stream stream = response.GetResponseStream())
{
// Use this stream to build a JSON document object:
JsonValue jsonDoc = await Task.Run(() => JsonObject.Load(stream));
//dynamic data = JObject.Parse(jsonDoc[15].ToString);
Console.Out.WriteLine("Response: {0}", jsonDoc.ToString());
// Return the JSON document:
return jsonDoc;
}
}
}
And I need to read some fields from file
I try to do it like this but it didn't work
Code:
private void ParseAndDisplay1(JsonValue json)
{
TextView productname = FindViewById<TextView> (Resource.Id.posttittle);
TextView price = FindViewById<TextView> (Resource.Id.price);
TextView weight = FindViewById<TextView> (Resource.Id.weight);
productname.Click += delegate {
var intent404 = new Intent (this, typeof(SoupesDetailActivity1));
StartActivity (intent404);
};
string path = System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal);
string filename = System.IO.Path.Combine (path, "myfile.txt");
using (var streamReader = new StreamReader (filename, true)) {
JsonValue firstitem = json [81];
productname.Text = firstitem ["post_title"];
price.Text = firstitem ["price"] + " грн";
weight.Text = firstitem ["weight"] + "г";
}
}
Can you help me with this problem?
Here's a simple way to read the JSON and manipulate it using Json.NET that you can install from Xamarin:
var url = "http://new.murakami.ua/?mkapi=getProducts";
string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
// Since you're just downloading the json you can use a webclient
using (var wc = new WebClient())
{
// Download the json data
var jsonData = await wc.DownloadStringTaskAsync(new Uri(url));
// Save the json data
File.WriteAllText(Path.Combine(path, "myfile.txt"), jsonData);
// Deserialize the Json into a list of object of the type YourObject
List<YourObject> list = JsonConvert.DeserializeObject<List<YourObject>>(jsonData);
// Do whatever you want to do with the data
foreach (var yourObject in list)
{
// this is just an example
Console.WriteLine(yourObject.post_title);
}
}
And this is the definition of the YourObject class:
// this will hold the deserialized objects and make it easy to use
// You can delete properties you don't need
public class YourObject
{
public int ID { get; set; }
public string post_author { get; set; }
public string post_date { get; set; }
public string post_date_gmt { get; set; }
public string post_content { get; set; }
public string post_title { get; set; }
public string post_excerpt { get; set; }
public string post_status { get; set; }
public string comment_status { get; set; }
public string ping_status { get; set; }
public string post_password { get; set; }
public string post_name { get; set; }
public string to_ping { get; set; }
public string pinged { get; set; }
public string post_modified { get; set; }
public string post_modified_gmt { get; set; }
public string post_content_filtered { get; set; }
public int post_parent { get; set; }
public string guid { get; set; }
public int menu_order { get; set; }
public string post_type { get; set; }
public string post_mime_type { get; set; }
public string comment_count { get; set; }
public string filter { get; set; }
public object img_url { get; set; }
public string visibility { get; set; }
public string price { get; set; }
public string weight { get; set; }
public string energy { get; set; }
public string sku { get; set; }
public int category { get; set; }
}

Categories

Resources