我正在尝试在ServiceStack Webservices中使用protobuf格式(遵循ServiceStack: REST with ProtoBuf by Steven Hollidge的示例。我添加了一个Winform应用程序来使用Web服务。代码如下所示。
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 :(得分:2)
看起来你有Hello
班,你的HelloResponse
班级被宣告两次。进入 HelloService.cs 后再次进入 Form.cs 中的内部类。从 Form.cs 文件中删除重复项应该允许ProtoBufServiceClient
引用正确的类/类型。
答案 1 :(得分: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; }
}
}
答案 2 :(得分:0)
将POCO类放在同一名称空间中,应该这样做。