|
A bit long but I'm really stuck here.
I've posted about this before, but I stil can't figure out what's wrong, so I"m going to extend my question with a lot more code.
I'm working on a WPF app that calls an Asp.net WebAPi. I'm having trouble calling Web API methods. In some cases, the API call succeeds and in some cases it fails. The issue seems to be the TYPE of params being passed.
I could really use someone with a lot more insight than me to help. Google searches lead me all over the place and I"m really stuck.
For example, this method works fine
[HttpPost]
public Response<Guid> AddRuleDefinition(RuleDefinitionEntity entity)
{
var response = new Response<Guid>();
try
{
IRulesBL bl = GetBL();
response.Data = bl.AddRuleDefinition(entity);
}
catch (Exception e)
{
response.Exception = e;
}
return response;
}
This only works if I pass the Guid as a string:
[HttpDelete]
public Response DeleteRuleDefinition([FromUri] string id)
{
var response = new Response();
try
{
IRulesBL bl = GetBL();
bl.DeleteRuleDefinition(new Guid(id));
}
catch (Exception e)
{
response.Exception = e;
}
return response;
}
This works, but the results list is null. The 'trigger' parameter is there:
[HttpPost]
public Response<List<string>> ExecuteRuleGroup(List<AssayResultEntity> results, string trigger)
{
var response = new Response<List<string>>();
try
{
IRulesBL bl = GetBL();
response.Data = bl.ExecuteRuleGroup(trigger, results);
}
catch (Exception e)
{
response.Exception = e;
}
return response;
}
I call the methods from the client using an wrapper class I call WebAPIExecutor.
public class WebAPIExecutor
{
private RestClient client;
<pre>
private RestRequest request;
public string ServerAddress { get; private set; }
public string URL { get; private set; }
public WebAPIExecutor(CredentialsEntity credentials, string ipAddress, string controller, Method method = Method.POST)
{
ServerAddress = string.Format("<a href="http:
client = new RestClient(ServerAddress);
client.AddHandler("text/plain", new JsonDeserializer());
request = new RestRequest(controller, method)
{
RequestFormat = DataFormat.Json
};
}
public void AddParameter(object value, string name = "")
{
if (value == null)
{
throw new ArgumentNullException("value");
}
Type type = value.GetType();
bool isPrimitive = type.IsPrimitive;
if (isPrimitive || type == typeof(string) || type == typeof(decimal))
{
if (string.IsNullOrEmpty(name) && request.Method == Method.GET)
{
throw new ArgumentNullException("Parameter 'Name' cannot be empty for Get requests");
}
request.AddParameter(name, value);
}
else
{
request.AddBody(value);
}
}
public async Task<T> ExecuteAsync<T>() where T : new()
{
URL = client.BaseUrl + request.Resource;
IRestResponse<t> restResponse = await client.ExecuteTaskAsync<t>(request, new CancellationToken());
var result = (T)restResponse.Data;
if (!string.IsNullOrEmpty(restResponse.ErrorMessage))
{
throw new Exception(restResponse.ErrorMessage);
}
else
{
if ((int)restResponse.StatusCode >= 299)
{
string message = string.Format("An error occured calling the WebAPI. {0} The status code is '{1}'. {2} The error message is {3}",
Environment.NewLine, restResponse.StatusCode, Environment.NewLine, restResponse.Content);
throw new Exception(message);
}
}
return result;
}
public async Task ExecuteAsync()
{
URL = client.BaseUrl + request.Resource;
IRestResponse result = null;
try
{
result = await client.ExecuteTaskAsync(request);
int resultCode = (int)result.StatusCode;
if (resultCode > 299)
{
string message = string.Format("An error occured calling the WebAPI. {0} The status code is '{1}'. {2} The error message is {3}",
Environment.NewLine, resultCode, Environment.NewLine, result.Content);
throw new Exception(message);
}
}
catch (Exception e)
{
throw e;
}
}
}
Then I created a proxy which has many methods that all look like this:
public async Task<Response<Guid>> AddRuleDefinitionAsync(RuleDefinitionEntity entity)
{
var webAPIExecutor = new WebAPIExecutor(Credentials, ServerUrl, "/Rules/AddRuleDefinition/", Method.POST);
webAPIExecutor.AddParameter(entity, "entity");
return await webAPIExecutor.ExecuteAsync<Response<Guid>>();
}
Here's my WebAPIConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
}
}
Global.Asax.cs
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configuration.MessageHandlers.Add(new APIKeyHandler());
GlobalConfiguration.Configuration.MessageHandlers.Add(new AuthHandler());
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
Thanks
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
Kevin Marois wrote:
if (isPrimitive || type == typeof(string) || type == typeof(decimal))
That line looks suspicious for the Guid problem - a Guid is not a primitive type, so you're always passing it in the body instead of the querystring.
A couple of other comments:
Kevin Marois wrote:
catch (Exception e)
{
throw e;
}
Don't do that. You've just destroyed the stack trace of the exception. If you have to re-throw an exception, just use throw; instead of throw e; . But in this case, since you're not doing anything with the exception, there's no point in catching it.
Kevin Marois wrote:
throw new Exception(message);
You should avoid throwing the base Exception type; use a more specific exception type instead.
If you throw the base Exception type, your calling code has no choice but to use a "Pokemon" catch block (gotta catch 'em all). It has no way of knowing whether it can handle the exception or not.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard Deeming wrote: if (isPrimitive || type == typeof(string) || type == typeof(decimal))
OK, so I changed this.
I now tried
Controller
[HttpGet]
public Response<List<string>> ExecuteRuleGroup(string trigger, List<AssayResultEntity> results )
{
var response = new Response<List<string>>();
try
{
IRulesBL bl = GetBL();
response.Data = bl.ExecuteRuleGroup(trigger, results);
}
catch (Exception e)
{
response.Exception = e;
}
return response;
}
Client
public async Task<Response<List<string>>> ExecuteRuleGroupAsync(string trigger, List<AssayResultEntity> results)
{
var webAPIExecutor = new WebAPIExecutor(Credentials, ServerUrl, "/Rules/ExecuteRuleGroup/", Method.GET);
webAPIExecutor.AddParameter(trigger, "trigger");
webAPIExecutor.AddParameter(results, "results");
return await webAPIExecutor.ExecuteAsync<Response<List<string>>>();
}
And the list is null on the controller.
Should the controller method be a POST? I've tried that but I then get a Not Found exception when I call it.
I'm really stuck here. What else could be causing the list to be null?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
List<AssayResultEntity> is not a primitive type, and is not one of the "special" types you're sending via the querystring, so it's always sent in the request body.
A GET request cannot have a request body.
So yes, it needs to be a POST request.
(You'll also need to update the client method to match.)
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Well I just created a quick console app.
Controller
I created a wrapper entity that contains the params I'm passing. Both the 'Trigger' param and the list of results are now properties on the AssayResultsEntity class. No other changes here.
[HttpPost]
public Response<List<string>> ExecuteRuleGroup(AssayResultsEntity results)
{
var response = new Response<List<string>>();
try
{
IRulesBL bl = GetBL();
response.Data = bl.ExecuteRuleGroup(results.Trigger, results.Results);
}
catch (Exception e)
{
response.Exception = e;
}
return response;
}
Console App
This works fine.
class Program
{
private readonly static string uri = "http://localhost:65078/API";
private readonly static HttpClient client = new HttpClient();
static void Main(string[] args)
{
RunAsync().GetAwaiter().GetResult();
}
static async Task RunAsync()
{
client.BaseAddress = new Uri("http://localhost:65078/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
await SendRulesAsync();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadLine();
}
static async Task SendRulesAsync()
{
AssayResultsEntity asr = new AssayResultsEntity
{
Trigger = "rule_trigger_bay_run_complete",
Results = new List<AssayResultEntity>
{
new AssayResultEntity { AccessionNumber = "Test 1" },
new AssayResultEntity { AccessionNumber = "Test 2" },
new AssayResultEntity { AccessionNumber = "Test 3" },
}
};
HttpResponseMessage response = await client.PostAsJsonAsync("api/Rules/ExecuteRuleGroup", asr);
response.EnsureSuccessStatusCode();
var returnValue = await response.Content.ReadAsAsync<Response<List<string>>>();
}
}
So this leads me to believe that my WebAPIExecutor class is the culprit. Anything wrong with this above approach? Again, I pretty new to WebAPI's so I'm not always sure.
one question.. .the PostAsJsonAsync methos only takes 1 param. Is it possible to pass multiple params to the controller using this?
Thanks
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
Well, I don't understand it, but I went back to my original code and used the wrapper class - no other changes, and now it works.
So the controller takes a class with a List<t> as a param, but not a List<t> as a param.
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
modified 12-Jun-19 12:42pm.
|
|
|
|
|
|
hello again...
please take a look at this site in progress: http://www.moonjams.net/cho2.html
I used a bootstrap design I nicked from GetBootstrap, because:
1) I very much liked the overlapping of the intro text & intro image in the section class
2) The fact that the main navbar is placed below the header
(in fact...my entire design premise is built around those two aspects; & the image collage above the footer)...but...the entire design is also linked to an external GetBootstrap stylesheet...meaning that, if that stylesheet were ever yanked from that site, my site would fall flat on it's face.
so...here's my basic questions:
1) In Bootstrap design...in any basic editor (right now using Dreamweaver CC2018)...how would I design (FROM SCRATCH) a page to look like this...where I could link to my own stylesheet; & also link to my own custom fonts? I've tried all the basic bootstrap templates (from Dreamweaver), but can't find anything even similar. When I use an existing template, I don't have the knowledge to maneuver it into that design.
2) in the past, I was used to working in a wysiwyg editor, where I could physically move images & text blocks around on a page...but that method is relegated to static design (& not responsive design). Is there some function in all basic editors that allows me to select an attribute & then somehow guide it to where I want it to be placed on the page...OR, even better yet...issue sets of commands in the code to have it placed there properly (so that I'm learning how to code properly as I'm working)?
thanx,
mf
|
|
|
|
|
I am not sure if I follow you in the question, since I have not explored Dreamweaver, but I believe what you need is something like this, Bootstrap Studio - The Revolutionary Web Design Tool.
Quote: where I could link to my own stylesheet; If you have access to HTML, then simply add the link element, if not, then use the tools that are provided to create a new node in the page and add the stylesheet.
As for the second part of your question, that requires something like a page builder. As for Bootstrap page builders, I am not so sure of this, a quick Google search for "bootstrap page builder" might help you. But I have to warn you that most of these tools would be premium tools.
Quote: OR, even better yet...issue sets of commands in the code to have it placed there properly Well, I don't think you can do that via a command-line interface.
The sh*t I complain about
It's like there ain't a cloud in the sky and it's raining out - Eminem
~! Firewall !~
|
|
|
|
|
I have a similar problem. I'm really looking forward to the correct answer.
|
|
|
|
|
Are you aware of the nature of CSS?
When you load a style sheet, you can override the styles in that style to be whatever you want them to be. All you have to remember is that your overrides must be placed in your html AFTER the original style sheet is loaded itno the DOM. Your styles can also be contained in another style sheet (they don't have to be specified in the html file.
The font issue - you should avoid using "your own font" if possible, or unless the font is *definitely* in the public domain. You can't use a propriatary (paid-for) font, because the font gets downloaded to your users' systems, and your users likely didn't also pay for the font (this would end up as a copyright violation).
However, the technique for using a specific font from your own site can be found here - @font-face - Google Search[^]
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
I have studied some of numpy python functions like append, reshape, sum etc. can anyone tell me which functions are important and where is the best source to do so
|
|
|
|
|
NumPy contains a large number of various mathematical operations. NumPy provides standard trigonometric functions, functions for arithmetic operations, handling complex numbers, etc. Refer below link has some more details -
Numpy | Mathematical Function - GeeksforGeeks[^]
modified 20-Sep-20 21:01pm.
|
|
|
|
|
The user you're replying to is a site-driving spammer.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks to let me know was not aware of it
modified 20-Sep-20 21:01pm.
|
|
|
|
|
using an ASP.Net MVC Web API
I have this controller method:
[HttpDelete]
public Response DeleteRuleDefinition(Guid id)
{
var response = new Response();
try
{
IRulesBL bl = GetBL();
bl.DeleteRuleDefinition(id);
}
catch (Exception e)
{
response.Exception = e;
}
return response;
}
I use a RestSharp wrapper class to call it like this:
public async Task<Response> DeleteRuleDefinitionAsync(Guid id)
{
var webAPIExecutor = new WebAPIExecutor(Credentials, ServerUrl, "/Rules/DeleteRuleDefinition/", Method.GET);
webAPIExecutor.AddParameter(id, "id");
return await webAPIExecutor.ExecuteAsync<Response>();
}
This fails with a "No action found..." error.
If I mark the method's param with [FromBody], the method is reached but the Guid is all zeros.
If I make the Guid param a string, and convert to Guid in the controller, the it works fine:
[HttpDelete]
public Response DeleteRuleDefinition(string id)
{
var response = new Response();
try
{
IRulesBL bl = GetBL();
bl.DeleteRuleDefinition(new Guid(id));
}
catch (Exception e)
{
response.Exception = e;
}
return response;
}
public async Task<Response> DeleteRuleDefinitionAsync(Guid id)
{
var webAPIExecutor = new WebAPIExecutor(Credentials, ServerUrl, "/Rules/DeleteRuleDefinition/", Method.GET);
webAPIExecutor.AddParameter(id.ToString(), "id");
return await webAPIExecutor.ExecuteAsync<Response<List<RuleDefintionEntity>>>();
}
What's the right way to pass a Guid to a controller?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
modified 4-Jun-19 14:48pm.
|
|
|
|
|
Have you tried making the request directly from Postman or a similar tool? That should at least narrow down whether the problem is the server or the client.
I've got several API endpoints using Guid parameters, and they just work. The only obvious difference I can see is that I'm using attribute routing:
Attribute Routing in ASP.NET Web API 2 | Microsoft Docs[^]
Eg:
Server:
[RoutePrefix("somePath")]
public class MyController : ApiController
{
[HttpDelete]
[Route("{id:guid}")]
public async Task<IHttpActionResult> Delete(Guid id, CancellationToken cancellationToken) { ... }
} Client:
private static readonly HttpClient httpClient = new HttpClient
{
BaseAddress = new Uri("https://mysite/api/")
};
public async Task<bool> Delete(Guid id, CancellationToken cancellationToken = default)
{
using (var request = new HttpRequestMessage(HttpMethod.Delete, $"somePath/{id:N}"))
using (var response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false))
{
if (response.StatusCode == HttpStatusCode.NotFound) return false;
response.EnsureSuccessStatusCode();
return true;
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
|
|
|
At the end of the day you have to have the password written somewhere...
What they say is that do not store it in the config file, as it may - even accidentally - pass from development to production...
The idea is to store the sensitive data in files that never will be part of the deployment (except if you are publishing your sins too ) - in this case the project file, which shared between developers but never goes public... (and yes - the project file stored in some GIT/TFS)
"The only place where Success comes before Work is in the dictionary." Vidal Sassoon, 1928 - 2012
|
|
|
|
|
Super Lloyd wrote: The secret API is for secret on each developer platform! (basically it suggest that 1 we shouldn't use TFS/Git) to share system configuration and then.. on top of that we can't setup and use secret on the prod machine! which is the whole point of the exercise!! On the same page;
"Production secrets shouldn't be used for development or test. You can store and protect Azure test and production secrets with the Azure Key Vault configuration provider."
..and;
"The Secret Manager tool doesn't encrypt the stored secrets and shouldn't be treated as a trusted store. It's for development purposes only. The keys and values are stored in a JSON configuration file in the user profile directory."
Super Lloyd wrote: To summarise, it feels to me like they tried to bamboozle me with this secret thing but it's utterly useless. It works differently from what you expected, which means it may not be intended to but may be there for some other purpose.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Hello All,
Since past few days, the powershell script is not working, it does a simple thing of moving files from one location to another location within same server. One location on E drive to another location on E drive.
I had a look at the event viewer - application logs, for any errors - I also manually copied a file to location, to see if there was any space or permissions issues all of a sudden. Is there any other location I can look for errors?
Many thanks!
|
|
|
|
|
Maybe a permissions issue? Without seeing the relevant parts of the script and the output from running the script, we can only guess.
Try debugging the script:
How to Debug Scripts in Windows PowerShell ISE | Microsoft Docs[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thank you for reply. Is there any other location we can find the log files, other than the event viewer?
==
move files to ScriptsWeb folder
Get-ChildItem -Path "E:\<.myfolder>INT" | Move-Item -Destination "E:\<myfolder>" -force
|
|
|
|
|