2

Я пытаюсь использовать Protobuf формат ServiceStack WebServices (следуя примеру в ServiceStack: REST with ProtoBuf by Steven Hollidge. Я добавил Winform приложение потреблять веб-сервиса. Коды приведены ниже.ServiceStack с форматом Protobuf

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

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

+0

Просто, чтобы убедиться, что это не связана с вложенным именованием класса, переместите type Hello, поэтому он не вложен в класс Form1. –

+0

Сделал это, Тип не ожидается, и контракт не может быть выведен: client.Hello произошел при ответе var = _client.Send (новый Hello {Name = "ProtoBuf" }); – jeff

ответ

0

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

+0

находится в одном и том же пространстве имен. Какова эта ошибка: => Тип не ожидается, и контракт не может быть выведен: client.Hello произошел при ответе var = _client.Send (новый Hello {Name = "Protobuf"}); – jeff

2

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

1

Я обновил 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; } 

} 



} 
Смежные вопросы