- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在评估ServiceStack。我需要创建一堆RESTful Web服务。我正在运行初始代码,对此我感到非常满意。我苦苦挣扎的是如何创建一个可以使用POST(或PUT)HTTP请求的服务,该请求的主体具有数据。
我已经在ServiceStack论坛(http://groups.google.com/group/servicestack/browse_thread/thread/693145f0c3033795)上找到了该线程,并对其进行了指导,我被引导着着眼于SO上的以下线程(Json Format data from console application to service stack),但它并没有真正的帮助-它描述了如何创建请求,而不是如何创建可以使用此类HTTP请求的服务。
当我尝试传递其他数据(在HTTP消息正文中)时,我的servuce返回以下错误(HTTP 400):
<TaskResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="">
<ResponseStatus>
<ErrorCode>SerializationException</ErrorCode>
<Message>Could not deserialize 'application/xml' request using ServiceStackMVC.Task'
Error: System.Runtime.Serialization.SerializationException: Error in line 1 position 8.Expecting element 'Task' from namespace 'http://schemas.datacontract.org/2004/07/ServiceStackMVC'..
Encountered 'Element' with name 'Input', namespace ''.
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream)
at ServiceStack.Text.XmlSerializer.DeserializeFromStream(Type type, Stream stream) in C:\src\ServiceStack.Text\src\ServiceStack.Text\XmlSerializer.cs:line 76
at ServiceStack.WebHost.Endpoints.Support.EndpointHandlerBase.CreateContentTypeRequest(IHttpRequest httpReq, Type requestType, String contentType) in C:\src\ServiceStack\src\ServiceStack\WebHost.Endpoints\Support\EndpointHandlerBase.cs:line 107</Message>
<StackTrace> at ServiceStack.WebHost.Endpoints.Support.EndpointHandlerBase.CreateContentTypeRequest(IHttpRequest httpReq, Type requestType, String contentType) in C:\src\ServiceStack\src\ServiceStack\WebHost.Endpoints\Support\EndpointHandlerBase.cs:line 115
at ServiceStack.WebHost.Endpoints.RestHandler.GetRequest(IHttpRequest httpReq, IRestPath restPath) in C:\src\ServiceStack\src\ServiceStack\WebHost.Endpoints\RestHandler.cs:line 98
at ServiceStack.WebHost.Endpoints.RestHandler.ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, String operationName) in C:\src\ServiceStack\src\ServiceStack\WebHost.Endpoints\RestHandler.cs:line 60</StackTrace>
</ResponseStatus>
</TaskResponse>
IRequiresRequestStream
。目前,我的代码如下:
public class Task : IRequiresRequestStream
{
public string TaskName { get; set; }
public string bodyData { get; set; }
public override bool Equals(object obj)
{
Task task = obj as Task;
if (task == null)
return false;
return TaskName.Equals(task.TaskName);
}
public override int GetHashCode()
{
return TaskName.GetHashCode();
}
public System.IO.Stream RequestStream
{
get
{
return new MemoryStream(System.Text.Encoding.UTF8.GetBytes(bodyData));
}
set
{
if (value.Length == 0)
{
bodyData = string.Empty;
}
else
{
byte[] buffer = new byte[value.Length];
int bytesRead = value.Read(buffer, 0, (int)value.Length);
bodyData = System.Text.Encoding.UTF8.GetString(buffer);
}
}
}
}
public class TaskService : RestServiceBase<Task>
{
public List<Task> tasks { get; set; }
public override object OnGet(Task request)
{
if (string.IsNullOrEmpty(request.TaskName))
{
if (tasks == null || tasks.Count == 0)
return "<tasks/>";
StringBuilder sb = new StringBuilder();
sb.AppendLine("<tasks>");
foreach (Task t in tasks)
{
sb.AppendFormat(" <task id={0}><![CDATA[{2}]]><task/>{1}", t.TaskName, System.Environment.NewLine, t.bodyData);
}
sb.AppendLine("</tasks>");
return sb.ToString();
}
else
{
if (tasks.Contains(request))
{
var task = tasks.Where(t => t.TaskName == request.TaskName).SingleOrDefault();
return String.Format("<task id={0}><![CDATA[{2}]]><task/>{1}", task.TaskName, System.Environment.NewLine, task.bodyData);
}
else
return "<task/>";
}
}
public override object OnPost(Task request)
{
if (tasks.Contains( request ))
{
throw new HttpError(System.Net.HttpStatusCode.NotModified, "additional information");
}
tasks.Add(new Task() { TaskName = request.TaskName, bodyData = request.bodyData });
return null;
}
}
Routes.Add<Task>("/tasks/{TaskName}").Add<Task>("/tasks");
http://localhost:53967/api/servicestack.task/xml/metadata?op=Task
来获取有关我创建的服务的更多信息。
All Verbs /tasks/{TaskName}
All Verbs /tasks
<Task xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ServiceStackMVC">
<AuxData>String</AuxData>
<TaskName>String</TaskName>
</Task>
POST http://localhost:53967/api/tasks/22
User-Agent: Fiddler
Host: localhost:53967
Content-Type: application/xml
Content-Length: 165
<Task xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ServiceStackMVC">
<AuxData>something</AuxData>
</Task>
public class Task
{
public string TaskName { get; set; }
public string AuxData { get; set; }
public override bool Equals(object obj)
{
Task task = obj as Task;
if (task == null)
return false;
return TaskName.Equals(task.TaskName);
}
public override int GetHashCode()
{
return TaskName.GetHashCode();
}
}
public class TaskService : RestServiceBase<Task>
{
public List<Task> tasks { get; set; }
public override object OnGet(Task request)
{
return tasks;
}
public override object OnPost(Task request)
{
if (tasks.Contains( request ))
{
throw new HttpError(System.Net.HttpStatusCode.NotModified, "additional information");
}
tasks.Add(new Task() { TaskName = request.TaskName });
return null;
}
}
最佳答案
是的,不建议返回xml字符串,因为返回的任何字符串都会直接写入响应流,因此该服务仅适用于XML服务,而不适用于所有其他端点。
ServiceStack方式
是为了让您在中定义Web服务的DTO保留自己的,它们在很大程度上是无依赖的程序集(我通常只会引用无impl和无dep的ServiceStack.Interfaces.dll)。然后,您可以将这些DTO与ServiceStack的通用服务客户端一起重用,以获取简洁,类型化的端到端API,而无需任何代码源。
不同的内置服务客户端
您的C#/。NET客户端只需使用包含在
ServiceStack.Common NuGet软件包,其中仅包含用于完整.NET和Silverlight 4/5客户端构建的ServiceStack.Text.dll,ServiceStack.Interfaces.dll和ServiceStack.Common.dll。
ServiceStack.Common包含以下服务客户端:
IServiceClient
和
IRestClient
接口(interface),因此,如果您想利用高级格式,就可以轻松换出。
Here's an example可以利用
相同的单元测试是
,也可以将用作JSON,XML,JSV和SOAP集成测试。
/api/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]
Send<TResponse>
和
SendAsync<TResponse>
API方法时使用的方法,这些方法使您可以调用Web服务
,而不必定义任何自定义路由,例如:
var client = new JsonServiceClient();
var response = client.Send<TaskResponse>(new Task());
FilesResponse response;
client.GetAsync<FilesResponse>("files/", r => response = r, FailOnAsyncError);
var response = client.Get<FilesResponse>("files/README.txt");
[assembly: ContractNamespace("http://schemas.servicestack.net/types",
ClrNamespace = "MyServiceModel.DtoTypes")]
EndpointHostConfig.WsdlServiceNamespace
中对其进行设置。
IRequiresRequestStream
的另一种替代方法是使用您可以在AppHost中定义的请求模型绑定(bind)程序,例如:
base.RequestBinders[typeof(Task)] = httpReq => ... requestDto;
关于c# - ServiceStack RESTful WebService并在消息正文中传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605167/
我创建了派生自的服务 ServiceStack.ServiceInterface.Service 实现一些请求。此服务实例的生命周期是多少 - 例如每次调用是否创建了一个新实例,或者该实例是否被缓存?
是否存在检测代码模型中的更改并自动重新创建数据库的首选方法?我不需要迁移数据,如果有更改,可以完全删除所有表,从模型中重新创建表,并使用代码中的初始数据集填充新表,这样就可以了。 与此相关:使用Ser
我正在尝试为 ServiceStack 服务创建一个自定义属性,我可以使用它来控制服务类中的每个方法。 这是我正在实现的属性类。 [AttributeUsage(AttributeTargets.Me
我在玩 ServiceStack,想知道它是否支持这种情况。我在我的请求类型中使用了泛型,这样许多从公共(public)接口(interface)继承的 DTO 将支持相同的基本方法 [比如... G
ServiceStack 服务中是否有任何机制来返回流/大型二进制数据? WCF 的 MTOM 支持虽然笨拙,但在返回大量数据而没有文本转换开销方面很有效。 最佳答案 我喜欢服务堆栈,这个小代码足以从
我很惊讶地发现没有关于这个主题的文档,有人知道 OrmLite 是否支持开放式并发吗?欢迎提供任何文档或示例引用。 最佳答案 这真的不取决于 OrmLite。这取决于隔离级别和您的数据库设置。 例子:
最近在做servicestack项目。当我尝试在项目中添加 open ServiceStack.ServiceInterface 时,它显示以下错误。 代码的 PFB 图片。 正如错误建议的那样,当我
我将如何使用 servicestack 处理静态文件? 我想添加一个像 Routes.Add(/app) 这样的路由,当客户端为此路径发出 GET 时,我需要返回一个 Silverlight xap
这类似于问题 Set Cache-Control: no-cache on GET requests ,这并没有真正得到回答。 在 API 响应中,缓存控制 header 被设置为私有(private
我刚刚进入 REST 和 ServiceStack,现在我的 GET 正在返回可能是 XML 或 Json 的字符串。 我现在需要处理更改我的域模型的 PUT 或 POST 命令。 对于单个资源,我的
一段时间以来,我们一直在将 ServiceStack 用于基于 REST 的服务,到目前为止,效果非常好。 我们所有的服务都写成: public class MyRestService : RestS
我读过@mythz 的这篇文章 https://stackoverflow.com/a/12413091/1095655 , 但我的声誉不够高,无法发表评论 我有一个问题正在工作。如果您收到带有版本
关于通用类型响应对象的文档,我遇到了 Swagger 的 ServiceStack 实现问题。强类型的响应对象被正确记录和显示,但是一旦通用类型的对象用作响应,文档就会不准确且具有误导性。 请求 DT
我目前正在研究一个解决方案,其中我们有一个自托管的 ServiceStack 层正在运行,但问题是当我从浏览器访问它并且浏览器尝试获取 favicon 时,我不断收到错误消息。据我所知,在运行自托管时
我正在查看 ServiceStack 中单元测试的源代码 TestHostBase.cs - 并让它与我自己的项目一起运行。在单元测试时如何在不实际启动监听器的情况下启用我的插件?例如,我想测试我的
ServiceStack 服务非常适合响应 Accept header 中请求的内容类型。但是如果我需要在请求过滤器中尽早关闭/结束响应,有没有办法用正确的内容类型进行响应?我在请求过滤器中所能访问的
我有一个 FileSystemBlobProvider 需要将物理路径映射到虚拟路径,反之亦然。我还需要访问主机名(我需要在给定应用程序相对路径的情况下生成公共(public) url)。理想情况下,
我阅读了新维基 Modularizing Services在 ServiceStack 页面上。我没有发现如何在插件中注册多个服务。当然我可以用appHost.Register(typeof(MySe
我想在重定向中保持状态并且想在重定向中保持一些状态。我认为 MVC 中的 TempData 会在 Rails 中执行此操作并闪烁消息。 ServiceStack 中的任何等效功能。我想在自己组装之前先
从 asp.net 网站调用 servicestack API 的最佳方法是什么。服务正在 IIS 中运行。服务堆栈中的所有方法都需要先进行身份验证。 我尝试使用 JsonServiceClient
我是一名优秀的程序员,十分优秀!