SignalR map hubs - asp.net

I am using SignalR to build Real time application
I have added the following code to application start in the global.asax file
'Register the default hubs route: ~/signalr
RouteTable.Routes.MapHubs()
and I got the following error:
A route named 'signalr.hubs' is already in the route collection. Route names must be unique.
Parameter name: name

It's most likely you are calling this twice. Check all your code that this is not the case, including any App_Start code. Do a global search within your app for "MapHubs".
Also check you have only one version of Signal installed (older versions had a different namespace).

Related

Web.Config transforms for Multi-Tenant deployment of WebForms app in docker over AWS ECS

Environment
ASP.NET WebForms app over IIS
Docker container host
AWS ECS hosting platform
Each client hosting its own copy of the app with private database connection string
Background
In the non-docker environment, each copy is a virtual directory under IIS, and thus have their own individual web.config pointing to dedicated databases. The underlying codebase is the same for each client, with no client-specific customization involved. The route becomes / here.
In the docker environment (one container per client), each copy goes over as a central root application.
Challange
Since the root image is going to be the same, how to have the web.config overridden for each client deployment.
We shouldn't create multiple images (one per client) as that will mean having extra deployment jobs and losing out on centralization. The connection strings should ideally be stored in some kind of dictionary storage applicable at ECS level which can provide client-specific values upon loading of corresponding containers.
Presenting the approach we used to solve this issue. Hope it may help others struck in similar cases.
With the problem statement tied to having a single root image and having any customization being applied at runtime, we knew that there needs to be a transformation of web.config at time of loading of the corresponding containers.
The solution was to use a PowerShell script that will read the web.config and get replace the specific values which were having a custom prefix embedded to the key. The values got passed from custom environmental variables within ECS and the web.config also got updated to have the keys with the prefix added.
Now since the docker container can have only a single entry point, a new base image was created which instantiated an IIS server and called a PowerShell script as startup. The called script called this transformation script and then set the ServiceMonitor on the w3cwp.
Thanks a lot for this article https://anthonychu.ca/post/overriding-web-config-settings-environment-variables-containerized-aspnet-apps/
I would use environment variables as the OP suggests for this with a start up transform, however I want to make the point that you do not want sensitive information in ENV variables, like DB passwords, in your ECS task definition.
For that protected information, you should use ECS secrets coupled with Parameter Store in Systems Manager. These values can be stored encrypted in the Parameter Store (using a KMS key) and the ECS Agent will 'inject' them as ENV variables on task startup.
For me, to simplify matters, I simply use secrets for everything although you can choose to only encrypt the sensitive information and leave the others clear.
I dynamically add the secrets for the given application into my task definitions at deploy time by looking up the 'secrets' for the given app by 'namespace' (something that Parameter Store supports). Then, if I need to add a new parameter, I can just add a new secret to the store in the given namespace and re-deploy the app. It will pick up and inject into the task definition any newly defined secrets automatically (or remove ones that have been retired).
Sample ruby code for creating task definition:
params = ssm_client.get_parameters_by_path(path: '/production/my_app/').parameters
secrets = params.map{ |p| { name: p.name.split("/")[-1], value_from: p.arn } }
task_def.container_definitions[0].secrets = secrets
This last transform injects the secrets such that the secret 'name' is the ENV variable name... which ends up looking like this:
"secrets": [
{
"valueFrom": "arn:aws:ssm:us-east-1:578610029524:parameter/production/my_app/DB_HOSTNAME",
"name": "DB_HOSTNAME"
},
{
"valueFrom": "arn:aws:ssm:us-east-1:578610029524:parameter/production/my_app/DB_PASSWORD",
"name": "DB_PASSWORD"
}
You can see there are no values now in the task definition. They are retrieved and injected when ECS starts up your task.
More information:
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html

Cloudera Post deployment config updates

In cloudera is there a way to update list of configurations at a time using CM-API or CURL?
Currently I am updating one by one one using below CM API.
services_api_instance.update_service_config()
How can we update all configurations stored in json/config file at a time.
The CM API endpoint you're looking for is PUT /cm/deployment. From the CM API documentation:
Apply the supplied deployment description to the system. This will create the clusters, services, hosts and other objects specified in the argument. This call does not allow for any merge conflicts. If an entity already exists in the system, this call will fail. You can request, however, that all entities in the system are deleted before instantiating the new ones.
This basically allows you to configure all your services with one call rather than doing them one at a time.
If you are using services that require a database (Hive, Hue, Oozie ...) then make sure you set them up before you call the API. It expects all the parameters you pass in to work so external dependencies must be resolved first.

Same stateless bean in two ears

I have the same EJB module with a bean inside an EAR that is server side and an EAR that is the client side.
Can I have this situation?
Because I'm getting this error http://justpaste.it/gfs3
without understand how to fix it.
You have answer in the stack trace:
The short-form default binding 'com.demo.view.RitornaPersonaRemote'
is ambiguous because multiple beans implement the interface :
[RitornaPersonaSenzaClientEAR#RitornaPersonaSenzaClient.jar#RitornaPersona,
RitornaPersonaWebSenzaClientEAR#RitornaPersonaSenzaClient.jar#RitornaPersona].
Provide an interface specific binding or use the long-form default binding on lookup.]
If you are asking whether you may have same EJB jar in multiple project - the answer is yes you can. However during deployment you have to use long-form JNDI, provide different JNDI name for beans in other module or disable short names. You cannot register two beans under same name.
Long name would be in the form RitornaPersonaSenzaClientEAR#RitornaPersonaSenzaClient.jar#com.demo.view.RitornaPersonaRemote
See detailed info here - EJB 3.0 and EJB 3.1 application bindings overview
UPDATE
To disable short names perform the following steps:
Go to Application servers > server1 > Process definition > Java Virtual Machine > Custom properties
Define new custom property com.ibm.websphere.ejbcontainer.disableShortDefaultBindings with value * to disable short bindings for all apps or AppName1|AppName2 to just disable short bindings in selected apps.
Example default bindings are shown in SystemOut.log:
The binding location is: ejblocal:JPADepEar/JPADepEJB.jar/TableTester#ejb.TableTester
The binding location is: ejblocal:ejb.TableTester
The binding location is: java:global/JPADepEar/JPADepEJB/TableTester!ejb.TableTester
And with disableShortDefaultBindings property set there is no short form:
The binding location is: ejblocal:JPADepEar/JPADepEJB.jar/TableTester#ejb.TableTester
The binding location is: java:global/JPADepEar/JPADepEJB/TableTester!ejb.TableTester
There is a bug in the documentation and the correct property is com.ibm.websphere.ejbcontainer.disableShortDefaultBindings not com.ibm.websphere.ejbcontainer.disableShortFormBinding
In my case:- i did install abc.ear and xyz.ear both ear was independent do dependency with each other.
I was calling abc.ear using client-lookup but that was giving me
com.ibm.websphere.naming.CannotInstantiateObjectException: Exception occurred while the JNDI NamingManager was processing a javax.naming.Reference object.
[Root exception is com.ibm.websphere.ejbcontainer.AmbiguousEJBReferenceException: The short-form default binding
'com.ejb.abc' is ambiguous because multiple beans implement the interface :
[xyz-ear#rabc-ejb-1.0.jar#abcInrerfaceImpl, rabc-ear#rabc-ejb-1.0.jar
abcInrerfaceImpl]. Provide an interface specific binding or use the long-form default binding on lookup.]
my Solution was:-
i removed the abc.jar that was inside another application(xyz.ear)
C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\wstemp\92668751\workspace\cells\mypc00Node01Cell\applications\xyz-ear.ear
'
Then solution client-lookup works fine.
To avoid this in future this is better practice to create separate node on your IBM-WAS server and install both application on different node.
So both application component will not mess up.

Workflow manager 1.0 and external dll

We are trying to publish a workflow and couple of activities to workflow manager. Our scenario is such that we need to create object of classes which resides in an external dll and those objects are calling a service(WCF) to fetch some data.
We have placed the DLLs in C:\Program Files\Workflow Manager\1.0\Workflow\WFWebRoot\bin\ and C:\Program Files\Workflow Manager\1.0\Workflow\Artifacts folders. Also we have created the AllowedTypes.XML file and have placed it in both the above folders.
The problem which we are facing is that when we declare a variable of a type which is in external DLL and try to invoke a method using InvokeMethod activity(we have also added the InvokeMethod activity type in AllowedTypes.xml) then we receive the following exception on the activity.publish statement.
Workflow XAML failed validation due to the following errors:
Cannot create unknown type '{http://schemas.microsoft.com/netfx/2009/xaml/activities}Variable({wf://workflow.windows.net/$Activities}ObjectType)'. HTTP headers received from the server - ActivityId: 33bf5b07-9eda-4f63-bf58-6d85cbfdcd55. NodeId: MachineID. Scope: /WFMgrSample. Client ActivityId : af5e1771-90f7-4610-a2be-5f7b7ce48ee8.
any idea on what is wrong here!!!

Biztalk WCF-webhttp (WCF web publishing wizard)

[I am new in biztalk trying to publish and consume servcie using webhttp (using Biztalk 2013, VS 2012)
getting following message and don't know want to do next to solve this issue.
*you have created a service.
To test this service, you will need to create a client and use it to call the service. you can do this using the svcutil.exe tool from the command line with the following syntax:
svcutil.exe "http://[host]/expwebhttpsampledesktop/service1.svc?singlews"*dl
"svcutil.exe" command it generates .cs, .wsdl, and metadata.xml files for me.
not sure what i am doing wrong here but trying to consume the service i made. and at the end of it i am getting following error
"Error consuming WCF service metadata. Message part missing element. Correct service description ""http://tempuri.org/" message type "service1_operation1_inputmessage"" part "Part" and return the wizard."]
thank you in advance
You need to create a client that will now consume the service. A client can be anything from a simple Console app, a BizTalk Send Port, another Web-Service or a Winforms/WPF app. The client will invoke your service (possibly passing parameters), you service will do its stuff and return a response back to the client.
There are a number of ways to create a client, however you might want to start with this tutorial from MSDN: http://msdn.microsoft.com/en-us/library/ms733133.aspx.
Alternatively, you might want to search for 'Add Service Reference Visual Studio 2012'. Adding a service reference creates the necessary libraries for your client to consume the service.
UPDATE: I found some relevant screenshots, so I thought I would add them....
To add a Service Reference, right-click on your Project and select 'Add Service Reference':
within the 'Add Service Reference' dialog, enter the address of the service (in your case http://[host]/expwebhttpsampledesktop/service1.svc) and click 'Go' for the wizard to auto-discover the service methods. Finally, update the service Namespace:
You will now be able to reference your service just like any other type within C# in order to invoke it.
HTH, Nick.

Resources