我有一个类似这样的网络服务:
[WebInvoke(UriTemplate = "/{userName}/?key={key}&machineName={machineName}", Method = "PUT")]
public HttpResponseMessage<SomeStuffPutResponse> PutSomeStuff(string userName, string key, string machineName, string theTextToPut)
{
// do stuff
}
我的global.asx看起来像:
RouteTable.Routes.MapServiceRoute<SomeStuffService>("1.0/SomeStuff", new HttpHostConfiguration());
当我通过C#HttpClient或fiddler点击web服务时,它会抛出500而不是我的方法。我添加了一堆日志记录,并收到以下错误:
服务操作 'PutSomeStuff'期望值 可分配给“String”类型以进行输入 参数'requestMessage'但是 收到类型的值 'HttpRequestMessage`1'。
UPDATE :如果我将theTextToPut变量设为自定义对象,则可以正常工作。如果它是像字符串一样的原始类型,它只会给我一些问题。
答案 0 :(得分:2)
解决方案1。
您可以将theTextToPut参数更改为HttpRequestMessage,然后阅读邮件内容。
[WebInvoke(UriTemplate = "/{userName}/?key={key}&machineName={machineName}", Method = "PUT")]
public HttpResponseMessage<SomeStuffPutResponse> PutSomeStuff(string userName, string key, string machineName, HttpRequestMessage request)
{
string theTextToPut = request.Content.ReadAsString();
}
解决方案2.
如果你真的想要将参数作为字符串获取,你可以创建一个操作处理程序来处理名为“theTextToPut”的所有字符串参数。
public class TextToPutOperationHandler : HttpOperationHandler<HttpRequestMessage, string>
{
public TextToPutOperationHandler()
: this("theTextToPut")
{ }
private TextToPutOperationHandler(string outputParameterName)
: base(outputParameterName)
{ }
public override string OnHandle(HttpRequestMessage input)
{
return input.Content.ReadAsString();
}
}
然后在Global.asax中设置服务,如下所示:
RouteTable.Routes.MapServiceRoute<SomeStuffService>("1.0/SomeStuff",
new HttpHostConfiguration().AddRequestHandlers(x => x.Add(new TextToPutOperationHandler())));
答案 1 :(得分:0)
它在uri中寻找字符串theTextToPut
。
答案 2 :(得分:0)
正如@ axel22所说,应用程序可能正在将 #FTP folder create
ftp -n -v $ftp_server $ftp_port << EOT
binary
user $user $heslo
mkdir $datum
cd $datum
mkdir $cas
EOT
绑定到URI。作为this article states,默认情况下,简单类型绑定到URI。
您可以使用FromBody attribute强制应用程序将theTextToPut
绑定到请求正文。