在WCF服务中传递对象

时间:2012-03-29 00:03:11

标签: wcf rest

我是新的WCF和非常好的服务。我正在学习如何在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>

2 个答案:

答案 0 :(得分:0)

我认为你不能将任何复杂的数据类型作为查询参数传递。根据您的要求使用另一个动词,如POST或PUT。你也可以将InputData序列化为json字符串或smth。并以这种方式传递。

答案 1 :(得分:0)

做一些这样的事情:

在合同文件中

glfwSetWindowIcon

在服务文件

[OperationContract]
[WebGet(UriTemplate = "/TabelasAuxiliares?requestex={requestex}", ResponseFormat = WebMessageFormat.Xml)]
    CadastrodeEscolasResponse TabelasAuxiliares(string requestex);

结论:通过将XML格式数据发送到字符串参数来调用服务。然后将XML转换为所需的类对象。这样就可以避免创建非常麻烦的QueryStringConvertor。希望这会有所帮助!这个帮助适用于所有人,而不仅仅是这篇文章。