【发布时间】:2012-03-29 00:03:11
【问题描述】:
我是新的 WCF 和 resful 服务。我正在学习如何在 WCF 服务中传递对象。
我有粘贴代码和 web.config 文件。我不知道为什么我会看到这个错误。
请帮忙..
Operation 'saveDataGet' in contract 'IRestServiceImpl' has a query variable named ' param1' of type 'GainSoft.TaskManager.Service.InputData', but type 'GainSoft.TaskManager.Service.InputData' is not convertible by 'QueryStringConverter'. Variables for UriTemplate query values must have types that can be converted by 'QueryStringConverter'.
Description: An unhandled exception occurred during the execution of the current web request.
Please review the stack trace for more information about the error and where it
originated in the code.
Exception Details: System.InvalidOperationException: Operation 'saveDataGet' in
contract 'IRestServiceImpl' has a query variable named 'param1' of type
'GainSoft.TaskManager.Service.InputData', but type
'GainSoft.TaskManager.Service.InputData' is not convertible by
'QueryStringConverter'. Variables for UriTemplate query values must have types that
can be converted by 'QueryStringConverter'.
public class RestServiceImpl : IRestServiceImpl
{
public string saveDataGet(InputData param1)
{
return "Via GET: " + param1.FirstName + " " + param1.LastName;
}
public string saveDataPost(InputData param1)
{
return "Via POST: " + param1.FirstName + " " + param1.LastName;
}
public class MyQueryStringConverter : QueryStringConverter
{
public override bool CanConvert(Type type)
{
return (type == typeof(InputData)) || base.CanConvert(type);
}
public override object ConvertStringToValue(string parameter, Type parameterType)
{
if (parameterType == typeof(InputData))
{
string[] parts = parameter.Split(',');
return new InputData { FirstName = parts[0], LastName = parts[1] };
}
else
{
return base.ConvertStringToValue(parameter, parameterType);
}
}
}
public class MyWebHttpBehavior : WebHttpBehavior
{
protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
{
return new MyQueryStringConverter();
}
}
public interface IRestServiceImpl
{
[OperationContract]
[WebGet(UriTemplate = "/InsertData?param1={param1}")]
string saveDataGet(InputData param1);
[OperationContract]
[WebInvoke(UriTemplate = "/InsertData")]
string saveDataPost(InputData param1);
}
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour" >
<!-- Add the following element to your service behavior configuration. -->
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="MyWebHttpBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
【问题讨论】: