Debugging into .net sources not working for me - c#

I'm using MVC 4 (beta), and having some problems trying to test an auth attribute I've written.
In order to look into this some more, I'm trying to use the debug into .net framework sources debugging options, to see exactly what is going wrong. I've followed the setup instructions here: http://weblogs.asp.net/gunnarpeipman/archive/2010/07/04/stepping-into-asp-net-mvc-source-code-with-visual-studio-debugger.aspx
After doing all this, when I debug into my tests to see what is going on, when I come to step into the line of code that calls into the .net fw, the test just terminates and gives me the exception I'm trying to debug. For completeness, here's my code:
var controller = new MyController();
controller.SetFakeAuthenticatedControllerContext("foo"); // Set up a fake http context for the user
var actionDescriptor = new Mock<ActionDescriptor>();
actionDescriptor.SetupGet(x => x.ActionName).Returns("AddedForTest");
var context = new AuthorizationContext(controller.ControllerContext, actionDescriptor.Object);
var auth = new SamCommandAuthenticationAttribute();
auth.OnAuthorization(context); // On this line the test will just terminate
Assert.Pass(); // This line would never be called.
Does anyone know why I'm not able to debug into the .net sources?

Microsoft Symbol server provides symbols for a subset of .net framework assembly.
I don't think Mvc4 beta is one of them...
----Added---
As Bond pointed out in the comment if you want to step into MVC4 Beta sources you have to include the mvc project in your solution and reference it from there, by first removing the reference to the GAC version which you've installed

Related

Unable to get Selenium with Edge to work in a basic C# console application

I am trying for the very first time to use Selenium. I would like to have a console application that opens a browser, goes to a website, and performs some actions.
To do this I looked up some tutorials. The first one I found is here:
https://learn.microsoft.com/en-us/microsoft-edge/webdriver-chromium/?tabs=c-sharp
I would like to automate Edge.
The first thing I did was get my Edge version, which incidentally decided to update when I went to the about page, something that will no doubt be a problem going forward.
I downloaded the file that corresponded to my version, although for some reason that version is x86 only while all the others are x64...
I then went to NuGet and searched for Selenium.WebDriver. Probably because I'm targeting 4.7.2 the latest version is 3.141 not version 4, but whatever. I install version 3.
I also add a nuget reference to Microsoft.Edge.SeleniumTools as instructed in the guide.
the guide then says use this code:
var options = new EdgeOptions();
options.UseChromium = true;
var driver = new EdgeDriver(options);
However I don't have a UseChromium property, so this does not work.
I removed it, and used the default constructor, however this also doesn't work because it can't find the driver.
So next I passed in the path to the folder the driver is in as a parameter.
This also did not work because it is looking for a file with a different name to the one in the edge driver zip download. It looks for microsoftwebdriver.exe while the zip file contains msedgedriver.exe. Perhaps this is the reason for the error? It actually has a link in the exception when it can't find it of where to download it, however the link is dead.
I renamed the file, and ran the code. A console window appeared with debug information, and the browser opened. Success!
Next I tried to go to a website, with this code:
driver.Url = "https://www.google.com";
However with this I got these errors in the console window:
Starting MSEdgeDriver 94.0.992.38
(55a0a486d5c4c1a7374dc28a7be702fee43b3b39) on port 1307 Only local
connections are allowed. Please see
https://chromedriver.chromium.org/security-considerations for
suggestions on keeping MSEdgeDriver safe. MSEdgeDriver was started
successfully.
DevTools listening on
ws://127.0.0.1:1310/devtools/browser/c4e7f6f6-46d3-447c-b26b-3ad231a6122f
[29296:584:1001/203949.853:ERROR:fallback_task_provider.cc(119)] Every
renderer should have at least one task provided by a primary task
provider. If a fallback task is shown, it is a bug. Please file a new
bug and tag it as a dependency of crbug.com/739782.
[29296:26032:1001/203954.115:ERROR:chrome_browser_main_extra_parts_metrics.cc(250)]
crbug.com/1216328: Checking default browser status started. Please
report if there is no report that this ends.
[29296:584:1001/203954.143:ERROR:profile_manager.cc(1057)] Cannot
create profile at path
C:\Users\NibblyPig\AppData\Local\Microsoft\Edge\User Data\Default
[29296:584:1001/203954.143:ERROR:profile_manager.cc(2010)] Cannot
create profile at path
C:\Users\NibblyPig\AppData\Local\Microsoft\Edge\User Data\Default
[29296:26032:1001/203954.176:ERROR:chrome_browser_main_extra_parts_metrics.cc(254)]
crbug.com/1216328: Checking default browser status ended.
The code then crashes with OpenQA.Selenium.WebDriverException: 'unknown error: net::ERR_CONNECTION_TIMED_OUT
I've tried googling the fallback task provider error and also looking at the profile error, but there is very little information and I am at a loss of what to do.
I wonder if anyone could advise what steps I might take to get this working.
First, if you use WebDriver with Selenium 3, the Selenium Tools for Microsoft Edge package must be installed.
Did you import the wrong package? Make sure it is using Microsoft.Edge.SeleniumTools; not using OpenQA.Selenium.Edge;.
This is my simple test, and it works well:
public static void Main() {
var options = new EdgeOptions();
options.UseChromium = true;
options.BinaryLocation = #"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe";
var driverPath = #"C:\Users\Administrator\Desktop";
var driver = new EdgeDriver(driverPath, options);
driver.Url = "https://www.google.com/";
}
Note: Please modify the path parameters according to your own situation.

System.Security.Cryptography.X509Certificates.X509Certificate2.GetECDsaPublicKey NotImplemented

We have created a signature in a .Net Core web api, using X509Certificate2.GetECDsaPrivateKey on a .pfx certificate file, and need to verify this signature in our Xamarin Android app, using the public key (.crt). I can run the code on a normal Windows .Net Framework 4.6.1 app and it works. If I change the Framework version to anything lower, my app doesn't compile, as the GetECDsaPublicKey method was only implemented in 4.6.1. In my Xamarin app, I can compile the app and it runs, but as soon as I reach the line that executes the GetECDsaPublicKey method, I get a NotImplemented exception. There is literally no information on this on the internet, apart from the Microsoft documentation, which doesn't give much in any case. Can anyone shed any light onto why this error occurs? Here are the few lines of code to load the certificate and verify the signature (I've taken out some unnecessary error checking code):
string FileName = "public_key.crt";
string certPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), FileName);
System.Security.Cryptography.X509Certificates.X509Certificate2 certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath);
System.Security.Cryptography.ECDsa eCDsa = certificate.GetECDsaPublicKey(); // This line causes the exception
Even just executing this line, gives the same error:
System.Security.Cryptography.ECDsa eCDsa = System.Security.Cryptography.ECDsa.Create();
So if anyone comes across this also struggling with it, there is a post that answers this question - Are ECDSA and ECDH available for mono?
Sadly, we will have to either use a different encryption/signing algorithm or use something like BouncyCastle...

Why is Selenium web driver crashing when attempting a navigation?

Situation :
To run integration tests on our ASP.NET MVC application, we chose Selenium's Web Driver.
Problem :
When running the tests from VS2015 using Internet Explorer Driver, the console displays an error message (see screenshot below).
Simultaneously, the browser opens and closes. The console freezes. Then, Visual Studio displays a StackOverflow exception message :
Diagnostic :
The test crashes as soon as the driver attempts a navigate action in the app.
[Test]
public void PerformNavigation()
{
Driver.Navigate().GoToUrl(GetAbsoluteUrl("/")); // <-- The test crashes here
}
However an external url works.
[Test]
public void PerformNavigation()
{
Driver.Navigate().GoToUrl("http://google.com"); // <-- This works
}
It seems that the web driver is redirected forever until a stackoverflow exception occurs (HTTP 302).
In debug mode, I can not find the main project's assembly (the one we are testing) in the modules window. It seems that the test project has some trouble loading this specific assembly : all other assemblies are here. I did not find any reason why an assembly couldn't be loaded.
Question :
I could not find any help on Google or SO. Our problem is very specific and may be a combination of issues.
So how can I make these integration tests work ?
Or at least : how can I perform a more precise diagnostic on this issue ?
UPDATE :
I eventually found out that the annotations before my controller methods were interfering with my tests. We use these annotations to check the user rights (here the user can read or update missions) :
[AuthorizedFunctionalities(Functionalities = "Mission_R;Mission_CUD")]
However I find it strange that these tests can not work with such annotations. They work well in debug mode but not through web drivers.
I'll try to investigate further.
You could try to load the assembly (.dll) dynamically, staight in the C# code, at the beginning of the tests.
To do so, you can use the following line of code :
Assembly.LoadFile($"{AppDomain.CurrentDomain.BaseDirectory}\\YourDLL.dll");
I eventually found out that the annotations before my controller methods were interfering with my tests. We use these annotations to check the user rights before the controller's methods:
[AuthorizedFunctionalities(Functionalities = "MyFunctionalities")]
By removing these anotations, the tests work. I still need to know why the web driver doesn't like these.

WCF Data Service 5.6 quick start

I have been trying to get a WCF Data Service server working for a few days now.
I finally backed off today and just tried to do exactly what the quick-start shows.. nothing else.. and in completely fresh project. Surely that would work.
But it didn't.. it failed the same way as my other tests.
I am just following along with this example. Using Visual Studio 2013 for Web express and the hosting is using IIS Express.
I have installed the WCF Tools version 5.6 such that Visual Studio has the WFC Data Service 5.6 template.
The gist of it is
create an ASP.Net Application Select MVC type, adding no folders for anything other than MVC and no unit tests, individual account authenticaion.
Add an ADO.Net Entity Data Model for the NorthWind database, called NorthwindEntities in web.config, importing all tables.
Add WCF Data Service 5.6 item, call it NorthWind.svc.
Change the NorthWind.svc.cs backing code to the following.
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
namespace StackOverflowApp
{
public class NorthWindService : DataService<NorthwindEntities>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
config.UseVerboseErrors = true;
config.SetEntitySetAccessRule("Orders", EntitySetRights.AllRead | EntitySetRights.WriteMerge | EntitySetRights.WriteReplace );
config.SetEntitySetAccessRule("Order_Details", EntitySetRights.AllRead| EntitySetRights.AllWrite);
config.SetEntitySetAccessRule("Customers", EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}
}
}
Now it is ready to build and run.. it should work.. yes?
I run it, and navigate to the service.. I am greeted with the following complaint.
<div id="content">
<p class="heading1">Request Error</p>
<p>The server encountered an error processing the request. See server logs for more details.</p>
</div>
How am I to debug that?
This is not the typical response when navigating to a page which generates an error in the application or to a page that does not exist. I get the feeling that the data.service system is generating this response.. that it actually started to process the request.. but failed for some obtuse reason.
I followed the instructions to a tee I thought, but apparently I missed something.
I've been through the process step by step several times now to try to find what I might have skipped to no avail.
Update:
Aha.. under another similar question, they recommended adding verbose messages using config.UserVerboseErrors = true. This didn't make any difference to me.. but the alternative method of using attributes sure did! Decorating the class with [ServiceBehavior(IncludeExceptionDetailInFaults = true)], now yields this more descriptive error.
The server encountered an error processing the request. The exception
message is 'Expression of type
'System.Data.Entity.Core.Objects.ObjectContext' cannot be used for
return type 'System.Data.Objects.ObjectContext''. See server logs for
more details. The exception stack trace is: blahblah
It sounds like you're using Entity Framework 6 which hasn't been out for all that long. You need to perform some additional steps to get WCF Data Services 5.6 and EF 6 to behave together nicely.
You need to add the additional WCF Data Services Entity Framework Provider Nuget package and then instead of inheriting your service from DataService<T>, you inherit from EntityFrameworkDataService<T>.
Full steps are on the data services blog here: http://blogs.msdn.com/b/astoriateam/archive/2013/10/02/using-wcf-data-services-5-6-0-with-entity-framework-6.aspx
Yes Thanks. Your answer is correct Chris. I was able to find the problem at last after I enabled the decorated version of verbose messaging, and got that extra detail regarding linking to objects being the problem.
So I found the problem and fixed it, or at least I can make it work using the quick-start guide now. Working with my own database is a little squirley still.. returns an empty set when I know I have items in the database.. but at least I now have working exhibit-A to compare against to find the issue. (Aha! found the problem there also, I had forgotten to add the entitie connection to web.config for my non-northwind database -- so its all workin' now!)
Anyway, the first decent clue was following the error message (that wasn't shown until after I enabled verbose messaging with the class attribute), found this note about the problem actually being with WCF's interface with EntityFramework 6. (had I not upgraded to version 6 I likely would not have had the problem)
https://entityframework.codeplex.com/workitem/896
Then, I searched for issues with WCF 5.6 and EntityFramework6. and whalla.. there is an alpha version of WCF which addresses the issue.
Note that if you follow the instructions here verbatim, there is still a problem (or was for me). Get alpha2 instead of alpha1 as it fixes a linking error. i.e.
Install-Package Microsoft.OData.EntityFrameworkProvider -Version 1.0.0-alpha2 -Pre
http://blogs.msdn.com/b/astoriateam/archive/2013/10/02/using-wcf-data-services-5-6-0-with-entity-framework-6.aspx
To install alpha2 today 6/7/2014 "Install-Package Microsoft.OData.EntityFrameworkProvider -Pre". Also the Microsoft.Data.Services version must be 5.6.0.0.

Remote unit testin of a WebService in Visual Studio 2010

I need to change my unit test from local to remote tests and so far I thought that all I had to do is change UrlToTest to point to another server... But VS keeps on insisting to create a Development Web Server instead of using the one that is already running.
So after reading some docs my question actually is do I have install Test Controller and Test Agent on both remote and local computer or what? What if the WebService is on Linux...
Note that I don't want to debug the application that I'm testing. I simply want tests to be executed for a WebService that is already running, that is deployed.
I probably should mention that all my tests consists of WebService calls and some checks like this:
[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("MainProjectName", "/")]
[UrlToTest("http://servername:port/websitename/TestingOnlyWebForm.aspx")]
public void LoginEmptyDataTest()
{
IUserService userService = CreateIUserService();
string email = "";
string password = "";
ReturnMessage<User> actual;
actual = userService.Login(email, password);
Assert.AreNotEqual(true, actual.Status);
Assert.AreNotEqual("db_error", actual.Info);
}
But I have also more complicated tests in which I change some data and send it to another WebService and so on.
Note that UrlToTest previously was pointing to localhost at which point it works but starts a developer server which is not what I want.
What you are trying to is not possible. All that generated unit test is trying to do is to run the test locally on the machine either using the development server by specifying AspNetDevelopmentServerHost or by using local IIS, when AspNetDevelopmentServerHost is not present.
If you want to test remote services right click your unit test project and add a service reference. Point to your service give it a namespace, say Services, and generate the proxies. Once you have the proxies generated just instantiate them and call the methods. Also remove all the unneeded attributes from your test. Your test should roughly look like this:
[TestMethod]
public void LoginEmptyDataTest()
{
using (var userServiceClient = new Services.UserServiceClient(
"BasicHttpBinding_IUserService",
"http://someremotehost/userservice.svc"))
{
var result = userServiceClient.Login("user", "password");
// asserts go here
}
}
This may solve your immediate problem however you should re-think what you are doing as #eglasius said. what happens if the code you call changes state internally? Next test might fail because of that so you need clean-up strategies otherwise your tests will be very brittle and you'll end up ignoring them.
Update: passing an address at run-time. Change the first parameter to whatever enpoint configuration name you have in your config file.
I'll take a stab in the dark at this one because I did something similar recently.
In my case my test project referenced the service project to provide visibility of the service and data contracts the Web Service implements and consumes.
To resolve this - though it can be ignored - move the contracts to a new project. Then have the service and test projects reference the new project, and remove the test projects' reference to the service.
Hope that makes sense!
Once the reference is removed, VS will no longer feel the need to start up your service when you run your tests.
You can disable the startup of the Service Host in the Project settings of your WCF Service Project. Right Click - WCF Options - Uncheck "Start WCF Service Host when debugging another project in the same solution".
You really have to consider the nature of what you're trying to achieve here.
It's hard to tell exactly what you're hitting of the code. I have the impression, you have is a website that calls a web service. You're testing the client code in that context, instead of just testing the service.
If that's the case, remove the attributes and point the url to the correct service like UrbaEsc guided you to. If you don't remove the attributes, you're running the calling code in the context of the site.
Even if the above is not the scenario, and based on what you replied to UrbanEsc in the comments, you'd then be testing an external call to the webservice initiated from the same site process.
You said:
"Found it, but VS still starts something on localhost and then trys to reach external server... Seems like VS is just not designed for real remote testing of webservices"
Read the above. I'd say you need to better understand what you're enabling. You can certainly test remote web services, like you can do pretty much anything you can code. You do that from client code that knows nothing different that what any other external client of the service would know. Support doesn't stop there, as you can do load testing of the service.
Note that what you're doing aren't unit tests, these are integration tests. Or depending on the scope of your system, full system tests.

Categories

Resources