ServiceStack с форматом Protobuf

Я пытаюсь использовать формат protobuf в веб-службах ServiceStack (следуя примеру в ServiceStack: REST с ProtoBuf от Стивена Холлиджа. Я добавил приложение Winform для использования веб-сервиса. Коды приведены ниже.

HelloService.cs

using System.Runtime.Serialization;
using ProtoBuf;
using ServiceStack.Demo.Rest;
using ServiceStack.ServiceHost;
using ServiceStack.ServiceInterface;

namespace ServiceStack.Demo.WebService
{
[DataContract] 
public class Hello
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}
 [DataContract] 
public class HelloResponse
{
    [DataMember(Order = 1)]
    public string Result { get; set; }
}

 public class HelloService : RestServiceBase<Hello>
{
    public  override object OnGet(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}
}

Global.asax.cs

using System;
using System.Web;
using Funq;
using ServiceStack.Demo.Rest;
using ServiceStack.Demo.WebService;
using ServiceStack.WebHost.Endpoints;

namespace ServiceStack.Demo
{
public class AppHost : AppHostBase
{
    public AppHost() : base("ServiceStack makes services easy!", typeof (AppHost).Assembly)
    {
        ServiceStack.Plugins.ProtoBuf.AppStart.Start();
    }

    public override void Configure(Container container)
    {
        Routes
          .Add<Hello>("/hello")
          .Add<Hello>("/hello/{Name}");

    }
 }

public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        new AppHost().Init();
    }
}
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ServiceStack.ServiceClient;
using ProtoBuf;
using ServiceStack.Plugins.ProtoBuf;
using System.Runtime.Serialization;
using ServiceStack.ServiceClient.Web;

namespace client
{
public partial class Form1 : Form
{
    private ServiceClientBase _client;
    private const string Url = "http://localhost/servicestack.demo/servicestack/hello?format=x-protobuf";
    public Form1()
    {
        InitializeComponent();
    }

    private void Button1Click(object sender, EventArgs e)
    {

        this._client =
            new ProtoBufServiceClient(Url);

        var response = _client.Send<HelloResponse>(new Hello {Name = "ProtoBuf"});
        label1.Text = response.Result;
    }

   
    public class Hello
    {
        public string Name { get; set; }
    }

    
    public class HelloResponse
    {
        public string Result { get; set; }
    }
}
}

Я получаю System.InvalidOperationException: Type is not expected, and no contract can be inferred: client.Form1+Hello

Что я делаю не так? Пожалуйста, предложите.....


person jeff    schedule 28.03.2013    source источник
comment
Просто чтобы убедиться, что это не связано с вложенным именем класса, переместите тип Hello так, чтобы он не был вложен в класс Form1.   -  person Anders Forsgren    schedule 28.03.2013
comment
Сделал это, Тип не ожидается, и контракт не может быть выведен: client.Hello произошло в var response = _client.Send‹HelloResponse›(new Hello {Name = ProtoBuf});   -  person jeff    schedule 28.03.2013


Ответы (3)


Похоже, у вас дважды объявлен класс Hello и класс HelloResponse. Один раз в HelloService.cs и снова как внутренние классы в Form.cs. Удаление дубликатов из файла Form.cs должно позволить вашему ProtoBufServiceClient ссылаться на правильные классы/типы.

person paaschpa    schedule 28.03.2013

Я обновил Form1.cs до следующего, и теперь он работает нормально (см. http://upjnv.blogspot.in/

 using System;  
 using System.Windows.Forms;  
 using ServiceStack.Plugins.ProtoBuf;  
 using System.Runtime.Serialization;  
 using ServiceStack.ServiceClient.Web;  

namespace client  

{  

 public partial class Form1 : Form  

 {  

private ServiceClientBase _client;  

private const string Url = "http://localhost/servicestack.demo/servicestack/";  

public Form1()  

{  

  InitializeComponent();  

}  

private void Button1Click(object sender, EventArgs e)  

{  

  this._client =  

    new ProtoBufServiceClient(Url);  

  var response = _client.Send<HelloResponse>("GET","/hello",new Hello {Name = "ProtoBuf"});  

  label1.Text = response.Result;  

 }  

 }  

[DataContract]  

public class Hello  

{  

[DataMember(Order = 1)]  

public string Name { get; set; }  

}  

[DataContract]  

public class HelloResponse  

 {  

[DataMember(Order = 1)]  

public string Result { get; set; }  

 } 



 }
person jeff    schedule 28.03.2013

Поместите свои классы POCO в одно и то же пространство имен, это должно сделать это.

person Martin Tapp    schedule 28.03.2013
comment
он находится в том же пространстве имен. что это за ошибка: => Тип не ожидается, и контракт не может быть выведен: client.Hello произошло в var response = _client.Send‹HelloResponse›(new Hello {Name = ProtoBuf}); - person jeff; 28.03.2013