servicestack,C#,Rest,servicestack" /> servicestack,C#,Rest,servicestack" />

C# 序列化对象POST';使用ServiceStack客户端的数据为空

C# 序列化对象POST';使用ServiceStack客户端的数据为空,c#,rest,servicestack,C#,Rest,servicestack,我正在使用服务堆栈在C#中构建一个restful服务 这是我的服务实现 命名空间云文件服务器 { [路由(“/updatefile”,“POST”)] 公共类更新文件 { 公共用户文件{get;set;} } 公共类CloudFileService:服务 { 公共InMemoryFileSystem文件系统{get;set;} 私有静态只读log4net.ILog logger=log4net.LogManager.GetLogger(typeof(CloudFileService));

我正在使用服务堆栈在C#中构建一个restful服务

这是我的服务实现

命名空间云文件服务器
{   
[路由(“/updatefile”,“POST”)]
公共类更新文件
{
公共用户文件{get;set;}
}
公共类CloudFileService:服务
{
公共InMemoryFileSystem文件系统{get;set;}
私有静态只读log4net.ILog logger=log4net.LogManager.GetLogger(typeof(CloudFileService));
公共作废帖子(更新文件请求)
{
试一试{
Debug(“收到的文件是:“+request.File”);
filesystem.addFileSynchronized(request.clientId,request.file);
}捕获(例外e){
调试(e);
投掷e;
}
}
}
}
我通过以下servicestack客户端代码调用此服务:

JsonServiceClient客户端=新的JsonServiceClient(端点);
UpdateFile arg=新的UpdateFile();
UserFile file=newuserfile(“x.txt”、“piyush”);
file.SetFileContent(getByteArrayFromString(“Filecontent”),0);
arg.file=文件;
client.Post(“/updatefile”,arg);
问题是,每当我通过上述客户机代码进行post调用时,服务器端接收到的文件对象都是空的(我通过将其写入日志文件来验证)

这是通过电线发送的。
File
类是
serialisable
,因为我可以通过
GET
调用正确地发送它


知道这里可能出了什么问题吗?

我已经测试了您的场景,无法重现您遇到的问题。我建议您验证您的
SetFileContent
方法和
getByteArrayFromString
方法,因为您可能会在其中出错。请随意发布该实现

此外,如果您捕获了向服务器发出的HTTP请求,以确定问题所在,这将非常有用

下面是自托管ServiceStack v4测试应用程序的完整工作源代码,该应用程序使用您概述的实现,我希望这对您有所帮助

使用系统;
使用ServiceStack;
使用System.Collections.Generic;
命名空间v4
{
类主类
{
//假定实现getByteArrayFromString
静态字节[]getByteArrayFromString(字符串路径)
{
返回System.IO.File.ReadAllBytes(路径);
}
公共静态void Main()
{
//简单的自托管控制台应用程序
var-appHost=新的appHost(500);
appHost.Init();
appHost.Start(“http://*:9000/”;
//测试服务
字符串filename=“image.png”;
JsonServiceClient=新的JsonServiceClient(“http://localhost:9000");
//创建并设置文件内容
UserFile file=新的UserFile(文件名,“用户名”);
SetFileContent(getByteArrayFromString(文件名),0);
//张贴文件
client.Post(“/updatefile”,newupdatefile{file=file});
Console.ReadKey();
}
}
公共类AppHost:AppHostHttpListenerPoolBase
{
公共AppHost(intPoolSize):基(“测试服务”、池大小、类型(TestService).Assembly){}
公共覆盖无效配置(Funq.Container){}
}
[路由(“/updatefile”,“POST”)]
公共类更新文件
{
公共用户文件{get;set;}
}
[可序列化]
公共类用户文件
{
公共字符串文件路径{get;set;}
公共字符串所有者{get;set;}
公共字节[]文件内容{get;set;}
公共长文件大小{get;set;}
公共列表sharedwithclients{get;set;}
公共长版本号{get;set;}
object privateLock=新对象();
公共用户文件(字符串文件路径、字符串所有者)
{      
this.filepath=filepath;
this.owner=所有者;
版本号=-1;
filesize=0;
filecontent=新字节[0];
sharedwithclients=新列表();
}
public void SetFileContent(字节[]内容,长版本)
{
filecontent=内容;
filesize=filecontent.Length;
版本号=版本号;
}
}
公共类TestService:Service
{
公共作废帖子(更新文件请求)
{
//请求已正确填充,即不为空。
Console.WriteLine(request.file.ToJson());
}
}
}

感谢您的回复。即使SetFileContent(它只是一个setter方法)和getByteArrayFromString存在一些问题,也会影响file类的成员。问题是接收的文件对象为空。另外,我在post调用中直接发送File对象,而您发送的是UpdateFile对象。有区别吗?@piyus没有设置
newupdatefile{file=file}
或者使用
args
对象没有任何区别。我这里的示例代码是有效的。因此,您的实现有些奇怪。你能试着运行它,看看它是否有效吗。只需创建一个新的控制台应用程序,添加ServiceStack包并从上面复制代码。将名为image.png的文件放在bin文件夹中,或将代码中的文件路径指向有用的位置。或者,正如我所提到的,您可以使用HTTP监视工具进行调试,例如。@Piyush您使用的ServiceStack的版本是什么,即4.019?你在本地测试吗?您测试的文件大小是多少,是否使用代理?任何其他相关的配置信息。@Piyush你把它整理好了吗?如果不是的话,如果你能提供更多的信息,我就可以试着结束这个问题。非常感谢Scott,它现在似乎正在工作。哟