从 windows 应用访问 WCF 服务方法
Accessing the WCF service method from windows app
我有一个 WCf 服务有这个默认方法
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
在 windows 应用程序中,我以
的身份访问了此方法
private async void btnLogin_Click_1(object sender, RoutedEventArgs e)
{
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
var res = await client.GetDataAsync(78);
txtUsername.Text = res;
}
正如您在我的方法中看到的那样,我正在 returning 一个字符串值。但是当我尝试在文本框中显示它时,它给出了错误
Cannot implicitly convert type
'ApplicationName.ServiceReference1.GetDataResponse' to 'string'
如果我使用 res.ToString()
它将打印
ClaimAssistantApplication.ServiceReference1.GetDataResponse
那不是我的字符串 return method.I,我是 WCF 服务的新手。有什么方法可以访问输出字符串吗?
您对这应该如何工作的期望是不正确的。
如果您想了解原因,请查看您的服务 WSDL。您可以通过在 visual studio 命令提示符下使用 disco.exe 工具来执行此操作,该工具会将所有服务元数据下载到目录:
disco /out:myOutputDir http://MyServiceAddress
在您的服务 WSDL 中,您会看到其中有一个 wsdl:operation
元素,它定义了您的服务操作。类似于:
<wsdl:operation name="GetData">
如果查看该元素,您应该会看到定义了 wsdl:output
消息类型。按照惯例,这将被称为:
(operation name)Response
因此在您的实例中,消息将被定义为 GetDataResponse 类型。这是您使用和调用服务操作时 return 的实际类型,由服务元数据定义。
事实上,如果您使用 fiddler 或类似的东西来调用服务操作,您应该会看到实际的响应消息被 returned。它看起来像这样:
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:GetDataResponse xmlns:m="YourServiceNamespace">
<getData>You entered: 78</getData>
</m:GetDataResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
您应该能够在您下载的服务元数据中找到 GetDataResponse
类型,可以是内联的,也可以是在其中一个 .xsd 文件中。
因此,当您向服务添加服务引用时,发生的事情是 visual studio 下载服务元数据,读取它,然后生成允许您调用该服务的 C# 代码。在生成该服务操作时,visual studio 发现 GetDataResponse XSD 类型是您的 GetData 服务操作的 return 类型,因此它生成一个名为 GetDataResponse 的 C# 类型,并将其赋值作为 return 类型的 Service1Client.GetData 和 GetDataAsync 方法。
如果你想获取你的操作响应的实际字符串值,那么你需要深入到 GetDataResponse 类型(我相信它会被称为"Value",但我不记得了)。
希望这对您的理解有所帮助。
我有一个 WCf 服务有这个默认方法
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
在 windows 应用程序中,我以
的身份访问了此方法private async void btnLogin_Click_1(object sender, RoutedEventArgs e)
{
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
var res = await client.GetDataAsync(78);
txtUsername.Text = res;
}
正如您在我的方法中看到的那样,我正在 returning 一个字符串值。但是当我尝试在文本框中显示它时,它给出了错误
Cannot implicitly convert type 'ApplicationName.ServiceReference1.GetDataResponse' to 'string'
如果我使用 res.ToString()
它将打印
ClaimAssistantApplication.ServiceReference1.GetDataResponse
那不是我的字符串 return method.I,我是 WCF 服务的新手。有什么方法可以访问输出字符串吗?
您对这应该如何工作的期望是不正确的。
如果您想了解原因,请查看您的服务 WSDL。您可以通过在 visual studio 命令提示符下使用 disco.exe 工具来执行此操作,该工具会将所有服务元数据下载到目录:
disco /out:myOutputDir http://MyServiceAddress
在您的服务 WSDL 中,您会看到其中有一个 wsdl:operation
元素,它定义了您的服务操作。类似于:
<wsdl:operation name="GetData">
如果查看该元素,您应该会看到定义了 wsdl:output
消息类型。按照惯例,这将被称为:
(operation name)Response
因此在您的实例中,消息将被定义为 GetDataResponse 类型。这是您使用和调用服务操作时 return 的实际类型,由服务元数据定义。
事实上,如果您使用 fiddler 或类似的东西来调用服务操作,您应该会看到实际的响应消息被 returned。它看起来像这样:
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:GetDataResponse xmlns:m="YourServiceNamespace">
<getData>You entered: 78</getData>
</m:GetDataResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
您应该能够在您下载的服务元数据中找到 GetDataResponse
类型,可以是内联的,也可以是在其中一个 .xsd 文件中。
因此,当您向服务添加服务引用时,发生的事情是 visual studio 下载服务元数据,读取它,然后生成允许您调用该服务的 C# 代码。在生成该服务操作时,visual studio 发现 GetDataResponse XSD 类型是您的 GetData 服务操作的 return 类型,因此它生成一个名为 GetDataResponse 的 C# 类型,并将其赋值作为 return 类型的 Service1Client.GetData 和 GetDataAsync 方法。
如果你想获取你的操作响应的实际字符串值,那么你需要深入到 GetDataResponse 类型(我相信它会被称为"Value",但我不记得了)。
希望这对您的理解有所帮助。