Размещение службы WCF вне WebRole и WorkerRole в консольном приложении C # на основе x86 в Windows Azure Cloud - PullRequest
0 голосов
/ 23 декабря 2010

Мы хотим создать приложение Azure, которое использует неуправляемую DLL-библиотеку win32, разработанную в VC ++ (мы не можем скомпилировать эту dll для 64-битной) для некоторой фоновой обработки.Самый первый вопрос: возможно ли это?Мы перепробовали много подходов, но ни один из них не сработал.Ниже представлен подход, который мы пробуем в настоящее время.Пожалуйста, помогите нам решить проблему или предложите лучшую технику.

Насколько нам известно, мы не можем использовать эту DLL непосредственно внутри WebRole или WorkerRole.Для этой цели мы хотим создать службу WCF, размещенную в консольном приложении C # на основе x86, которое может использовать эту Win32 DLL.Мы запустим это приложение в облаке и разместим наш сервис WCF.При таком подходе мы разработали проект Cloud в visual studio 2010 и Windows Azure SDK 1.2, который отлично работает на локальном эмуляторе.Но это не работает на облаке.На сегодняшний день мы можем запустить это приложение и службу WCF в облаке, но проблема заключается в том, что при использовании службы она выдает следующие ошибки.

Удаленный сервер возвратил ошибку: (404) Не найдено.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Net.WebException: The remote server returned an error: (404) Not Found.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[WebException: The remote server returned an error: (404) Not Found.]
   System.Net.HttpWebRequest.GetResponse() +7769892
   System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +156

[EndpointNotFoundException: There was no endpoint listening at http://10.62.43.187:20000/CalculatorService/Http that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.]
   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +4767763
   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +1725
   emuser_WCFContract.ICalcService.Add(Int32 num1, Int32 num2) +0
   emuser_WebRole._Default.btnAdd_Click(Object sender, EventArgs e) in C:\projects\emuserWCF_HTTP\emuser_WebRole\Default.aspx.cs:39
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3691

Мы используем BasicHTTPBinding.Ниже приведены сведения о нашем контракте на обслуживание, классе обслуживания и приложении хоста.

Service Contract:
[ServiceContract]
    public interface ICalcService
    {
        [OperationContract]
        int Add(int num1, int num2);
        [OperationContract]
        int Sub(int num1, int num2);
    }

Класс реализации услуги:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
                     ConcurrencyMode = ConcurrencyMode.Multiple,
                     IncludeExceptionDetailInFaults = true,
                     AddressFilterMode = AddressFilterMode.Any)]
    public class CalcService : ICalcService
    {
        public int Add(int num1, int num2)
        {
            return num1 + num2;
        }
         public int Sub(int num1, int num2)
        {
            return num1 - num2;
        }
    }

Фрагмент кода отWebRole.

Мы используем конечную точку HttpIn WebRole и ее порт для привязки сервиса.В следующем фрагменте кода мы запускаем это консольное приложение из метода onStart () WebRole (WebRole.cs)

 ProcessStartInfo psi = new ProcessStartInfo(path);
    RoleInstanceEndpoint externalEndPoint =   RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpIn"];
psi.Arguments = externalEndPoint.IPEndpoint.ToString();
                              Global.ExternalIp = externalEndPoint.IPEndpoint.ToString();
                              Process dllHost = Process.Start(psi);

Мы знаем, что это консольное приложение хорошо запускается в облаке и запускает службу WCF.

Ниже приведен фрагмент кода консольного приложения, в котором размещается служба WCF.

string ep = args[0]; 
        string baseAddress = "http://" + ep + "/CalculatorService"; 
        ServiceHost serviceHost = new ServiceHost(typeof(CalcService), new Uri(baseAddress));
        Console.WriteLine("WCFHost_x86 Is Started - v1.3");
        Console.WriteLine("Endpoint Received : " + ep); 
        try
        {
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            serviceHost.Description.Behaviors.Add(smb);
            BasicHttpBinding httpBinding = new BasicHttpBinding(BasicHttpSecurityMode.None); 

            serviceHost.AddServiceEndpoint(typeof(ICalcService), httpBinding, "http://" + ep + "/CalculatorService/Http");
            Binding mexBinding = MetadataExchangeBindings.CreateMexHttpBinding();
            Uri mexAddress = new Uri("http://" + ep + "/CalculatorService/Mex");
            serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexAddress);
            mexAddress = new Uri("http://" + ep + "/CalculatorService/Http/Mex");
            serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexAddress);
            serviceHost.Open();
            Console.WriteLine("Service Started At Endpoint : " + baseAddress);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error In Starting WCF Host : " + ex.Message);
        }
        Console.WriteLine("Press <Enter> To Exit");
        Console.ReadLine();

Ниже приведен фрагмент кода клиента WCF, который мы создаем наСтраница deafault.aspx.cs.

private static bool initilized = false;
    private static ICalcService CalculatorClient;
    protected void Page_Load(object sender, EventArgs e)
    {
        lblService.Text = "http://" + Global.ExternalIp + "/CalculatorService/Http";
        lblExtIp.Text = Global.ExternalIp;
        if (!initilized)
        {
            BasicHttpBinding httpBinding = new BasicHttpBinding(BasicHttpSecurityMode.None);                                
            EndpointAddress endPoint = new EndpointAddress("http://" + Global.ExternalIp + "/CalculatorService/Http");                
            ChannelFactory<ICalcService> factory = new ChannelFactory<ICalcService>(httpBinding, endPoint);
            CalculatorClient = factory.CreateChannel();
            initilized = true;
        }
    }
     protected void btnAdd_Click(object sender, EventArgs e)
    {
        int num1 = Int32.Parse(txtNum1.Text);
        int num2 = Int32.Parse(txtNum2.Text);
        int result = CalculatorClient.Add(num1, num2);
        txtResult.Text = result.ToString();
    }

Пожалуйста, помогите нам решить проблему или предложите лучшую технику.Заранее спасибо

1 Ответ

0 голосов
/ 30 декабря 2010

Несколько снимков в темноте - может быть, вам нужно работать с повышенными привилегиями?

...