Написание простого веб-сервиса на C # и вызов его из Ruby on Rails - PullRequest
3 голосов
/ 12 марта 2010

Мне нужно создать простой веб-сервис на C #, но я не уверен, с чего начать (я уже программировал UI-приложения на C #, но весь мой веб-опыт - в Ruby on Rails). С чего начать?

Единственным клиентом для веб-службы будет приложение Ruby on Rails, поэтому нет необходимости в каком-либо рендеринге HTML. Я думал просто вернуть строку в формате XML или YAML, если нет более простого способа. Я не слишком заинтересован в SOAP, но если это легко / естественно в C # и Ruby, то я рассмотрю это (или что-нибудь еще).

Ответы [ 4 ]

1 голос
/ 01 апреля 2010

Я согласен с маршрутом MVC. Вот что я использую для вывода объектов в виде XML:

public class XmlResult : ActionResult {
    public XmlResult(object anObject) {
        Object = anObject;
    }

    public object Object { get; set; }

    public override void ExecuteResult(ControllerContext aContext) {
        if (aContext == null) throw new Exception("Context cannot be null");
        var response = aContext.HttpContext.Response;
        response.ContentType = "application/xml";
        SerializeObjectOn(Object, response.OutputStream);
    }

    private void SerializeObjectOn(object anObject, Stream aStream) {
        var serializer = new XmlSerializer(anObject.GetType());
        serializer.Serialize(aStream, anObject);
    }
}

public class MyController : Controller {
    public ActionResult Index() {
        return  new XmlResult(object);
    }
}

Запрос через http://localhost/mycontroller

1 голос
/ 12 марта 2010

Если у вас есть среда IIS 6 или 7, которую вы можете развернуть, я бы просто создал приложение ASP.NET-MVC 2.Вы можете создать его с помощью шаблона Visual Studio, а затем иметь контроллер, подобный следующему:

public class ApiController : Controller {        

        public ActionResult Index(string id) {

            var xml = new XElement("results", 
                            new XAttribute("myId", id ?? "null"));

            return Content(xml.ToString(), "text/xml");
        }

    }

Вывод URL типа http://localhost:4978/Api/Index/test будет:

<results myId="test"/>

Вы можете легко расширитьэто возвращает любой формат, который вы хотите (JSON и т. д.).В любом случае, ASP.NET MVC позволяет довольно просто создать REST API, который должен легко использоваться из Ruby.

1 голос
/ 13 марта 2010

Если вы хотите гибкости WCF, следующий код должен помочь вам начать. WCF может быть более сложным, чем другие ответы, но он обеспечивает некоторые преимущества, такие как повышенная гибкость и возможность размещения ваших служб из службы Windows.

Создайте сервис, который выглядит следующим образом:

    [ServiceContract]
    public interface ITestService {

        [OperationContract]
        [WebGet(
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Xml            
            )]
        XElement DoWork(string myId);

    }

И значение будет:

    public class TestService : ITestService {

        public XElement DoWork(string myId) {

            return new XElement("results", new XAttribute("myId", myId ?? ""));
        }
    }

Ваш файл конфигурации приложения (web.config или app.config) будет содержать что-то вроде следующего:

    <system.serviceModel>
        <behaviors>
      <endpointBehaviors>
        <behavior name="WebBehavior">
          <webHttp />          
        </behavior>
      </endpointBehaviors>
    </behaviors>
        <services>
            <service name="WebApplication1.TestService">
                <endpoint behaviorConfiguration="WebBehavior"
                  binding="webHttpBinding" 
                  contract="WebApplication1.ITestService">
                </endpoint>             
            </service>
        </services>
    </system.serviceModel>

Если бы вы разместили это на сайте ASP.NET, у вас был бы файл с именем TestService.svc со следующим:

<%@ ServiceHost Language="C#" Debug="true" 
                Service="WebApplication1.TestService" 
                CodeBehind="TestService.svc.cs" %>
0 голосов
/ 12 марта 2010

вот простой пример.

Я использовал Visual Studio для создания файла .asmx и поместил его в код .cs позади.

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;

namespace MyNamespace.Newstuff.Webservice
{
    [WebService(Namespace = "http://iamsocool.com/MyNamespace/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class MyNamespace : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...