C#WCF Web API问题发布/推送

时间:2011-06-24 00:41:51

标签: c# http wcf-web-api

我有一个类似这样的网络服务:

[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变量设为自定义对象,则可以正常工作。如果它是像字符串一样的原始类型,它只会给我一些问题。

3 个答案:

答案 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绑定到请求正文。