我在WebGet下面的操作合同定义如下。
[OperationContract]
[WebGet(UriTemplate = "UpdateUserDetails/?configdata={_userConfigData}&configresult={_configResult}&clientip={_clientIP}&adminname={AdminName}")]
public void UpdateUserDetails(UserConfigData _userConfigData, ConfigResult _configResult, string _clientIP, string AdminName)
当我运行该服务时,我遇到了错误。任何想法如何解决这个问题?
合同'UserConfigService'中的'UpdateUserDetails'操作有一个名为'_userConfigData'的查询变量,类型为Service1.WCF.UserConfig.UserConfigData',但类型'Service1.WCF.UserConfig.UserConfigData'不能由'QueryStringConverter'转换。 UriTemplate查询值的变量必须具有可由“QueryStringConverter”转换的类型。
答案 0 :(得分:2)
我假设你使用Json对象来请求数据 它应该是这样的:
[OperationContract]
[WebInvoke(UriTemplate = "UpdateUserDetails?_clientIP={_clientIP}&AdminName={AdminName}", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
public void UpdateUserDetails(UserConfigData _userConfigData, ConfigResult _configResult, string _clientIP, string AdminName)
JSON数据似乎是这样的:
{
"_userConfigData":{
"Property1":"value",
"Property2":"value",
"Property3":"value"
..and so on...
},
"_configResult":{
"Property1":"value",
"Property2":"value",
"Property3":"value"
..and so on...
}
}
有一个很好的测试Rest服务的应用程序,您可以尝试使用:
其他信息
响应结果“找不到方法”
您可能没有正确定义端点或服务地址。您的webconfig文件应具有此类配置。
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<bindings>
<basicHttpBinding>
<binding name="soapBinding">
<security mode="None"></security>
</binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="webBinding"></binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="defaultServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!-- USING SOAP-->
<service behaviorConfiguration="defaultServiceBehavior" name="MyProject.WCF.UserConfig.UserConfigService">
<endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding" contract="MyProject.WCF.UserConfig.IUserConfigService"></endpoint>
</service>
<!-- USING JSON-->
<service behaviorConfiguration="defaultServiceBehavior" name="MyProject.WCF.UserConfig.UserConfigService">
<endpoint address="json" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="jsonBehavior" contract="MyProject.WCF.UserConfig.IUserConfigService"></endpoint>
</service>
</services>
</system.serviceModel>
地址如下:
SOAP
localhost:1706/soap/UserConfigService.svc
JSON
localhost:1706/json/UserConfigService.svc
为了更好地参考,您可以尝试在此处观看:
How to create simple REST Based WCF Service with JSON format
答案 1 :(得分:0)
你必须使用字符串,你不能使用一个对象作为查询字符串参数。它不会将您的查询字符串转换为对象。那些变量应该定义为字符串。
答案 2 :(得分:0)
Here's a link on implementing a custom QueryStringConverter
,它会做你想要的。 另请注意(在该帖子中提到),将UserConfigData
或ConfigResult
等(可能)复杂对象作为POST数据传递,而不是在URL中传递可能更好。考虑到你的方法被称为“UpdateUserDetails”,最好是以REST的精神使用POST(WebInvoke
)而不是GET(WebGet
)。