I have seen a few articles on creation of a hosted service using C#. Most articles describe creation of a hosted service in a cloud environment very nicely. But this article will explain creation of a hosted service in Azure as well as some error descriptions. (I struggled a lot, while adding a certificate, accessing a certificate and resolving the errors conflict error, bad request (400) and hosted service name is invalid etc.).
I would like to mention a few things in here related to creation of a hosted service:
- Service Name; actually a service name will be assigned to the DNS Prefix property in the cloud staging or production environment.
- It is recommended to have a minimum of four to five characters.
- According to Azure standards, we should add "DNS" as a prefix with the service name.
- It should not contain the "/","\","." characters. It does allow the "-" character.
- The text assigned to the label field will be used as the hosted service name in the cloud environment.
Otherwise you will get an error like "Bad Request (400)-Invalid hosted service name". Your URI should be like this:
"https://management.core.windows.net/" + subscriptionId + "/services/hostedservices";
Step 1: Passing inputs to CreateHostedServiceMethod
protected void BtnCreateHostedService_Click(object sender, EventArgs e)
{
try
{
String subscriptionId = "Your subscription ID";
String thumbprint = "Certificate Thumbprint";
String serviceName = "DNSVM"+Unique variable.
String label ="New Hosted Service"+Unique Variable;
String description = New Hosted Service"+Unique Variable;
String location = "Anywhere US";
String affinityGroup = string.Empty;
CreateAzureHostedService example = new CreateAzureHostedService();
String requestId = example.CreateHostedService(
subscriptionId, thumbprint, serviceName, label,
description, location, affinityGroup);
}
catch (Exception ex)
{
LBLErrorMssg.Text = ex.Message;
}
}
Step 2: Create Hosted Service method.
public String CreateHostedService(String subscriptionId, String thumbprint, String serviceName, String label, String description, String location, String affinityGroup)
{
String uri =
String.Format(createHostedServiceFormat, subscriptionId);
XDocument payload = CreatePayload(serviceName, label,
description, location, affinityGroup);
ServiceManagementOperation operation =
new ServiceManagementOperation(thumbprint);
String requestId = operation.Invoke(uri, payload);
return requestId;
}
String createHostedServiceFormat ="https://management.core.windows.net/{0}/services/hostedservices";
Step 3: Here, the more important thing is the XML http web request body.
If you are creating a Http request body in runtime code then it should be like this:
private XDocument CreatePayload(String serviceName, String label, String description,String location, String affinityGroup)
{
String base64LabelName = ConvertToBase64String(label);
XElement xServiceName =
new XElement(wa + "ServiceName", serviceName);
XElement xLabel =
new XElement(wa + "Label", base64LabelName);
XElement xDescription =
new XElement(wa + "Description", description);
XElement xLocation =
new XElement(wa + "Location", location);
XElement xAffinityGroup =
new XElement(wa + "AffinityGroup", affinityGroup);
XElement createHostedService =
new XElement(wa + "CreateHostedService");
createHostedService.Add(xServiceName);
createHostedService.Add(xLabel);
createHostedService.Add(xDescription);
createHostedService.Add(xLocation);
//createHostedService.Add(xAffinityGroup);
XDocument payload = new XDocument();
payload.Add(createHostedService);
payload.Declaration =
new XDeclaration("1.0", "UTF-8", "no");
return payload;
}
The final result should be:
<?xml version="1.0" encoding="utf-8"?>
<CreateHostedService xmlns="http://schemas.microsoft.com/windowsazure">
<ServiceName>service-name</ServiceName>
<Label>base64-encoded-service-label</Label>
<Description>description</Description>
<Location>location</Location>
<AffinityGroup>affinity-group</AffinityGroup>
</CreateHostedService>
Step 4: Label content should be in the Base64String format
private String ConvertToBase64String(String value)
{
Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(value);
String base64String = Convert.ToBase64String(bytes);
return base64String;
}
Step 5: Getting a response from the management API
public String Invoke(String uri, XDocument payload)
{
Uri operationUri = new Uri(uri);
HttpWebRequest httpWebRequest =
CreateHttpWebRequest(operationUri, "POST");
using (Stream requestStream =
httpWebRequest.GetRequestStream())
{
using (StreamWriter streamWriter =
new StreamWriter(requestStream,
System.Text.UTF8Encoding.UTF8))
{
payload.Save(streamWriter,
SaveOptions.DisableFormatting);
}
}
String requestId;
using (HttpWebResponse response =
(HttpWebResponse)httpWebRequest.GetResponse())
{
requestId = response.Headers["x-ms-request-id"];
}
return requestId;
}
Getting a request ID from the GetResponse Method will ensure that the hosted service has been created successfully.