2

我試圖在ServiceStack WEBSERVICES使用protobuf的格式(以下在ServiceStack: REST with ProtoBuf by Steven Hollidge的例子中我添加了一個WinForm應用程序消耗web服務。這些代碼在下面給出。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

只是爲了確保它不與類的嵌套命名做,移動鍵入Hello,以便它不嵌套在Form1類中 – 2013-03-28 09:27:20

+0

是否這樣,Type不是,並且不能推斷出合約:client.Hello發生在var response = _client.Send (new Hello {Name =「ProtoBuf」 }); – jeff 2013-03-28 09:37:56

回答

0

把你的POCO類放在相同的命名空間,應該這樣做。

+0

它在同一個命名空間中,這個錯誤是什麼:=>類型不是預期的,並且不能推斷出合約:client.Hello發生在var response = _client.Send (new Hello {Name = 「protobuf的」}); – jeff 2013-03-28 13:50:05

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; } 

} 



} 
相關問題