Xamarin表单的Rest + WCF集成
本文关键字:WCF 集成 Rest 表单 Xamarin | 更新日期: 2023-09-27 18:10:53
我正在做一个需要连接到WCF服务的Xamarin Forms项目。我必须使用Rest来访问它,所以我选择使用与pcl兼容的RestSharp版本。我已经做过很多基于SOAP的web服务,但这是我第一次尝试Rest,我觉得我错过了一些非常基本的东西。我已经确认,当我进行SOAP调用时,我的web服务功能正确,所以我相信我的设置不正确。
下面是我的web服务的示例代码:
Imports System.IO
Imports System.Net
Imports System.ServiceModel
Imports System.ServiceModel.Description
Imports System.ServiceModel.Web
<ServiceContract()>
Public Interface Iapi
<WebInvoke(Method:="PUT",
UriTemplate:="Login/Email/{Email}/Password/{Password}",
RequestFormat:=WebMessageFormat.Json,
ResponseFormat:=WebMessageFormat.Json)>
<OperationContract(AsyncPattern:=True)>
Function Login(email As String, password As String) As String
End Interface
下面是我尝试调用服务的示例代码:
public void Login(string email, string password)
{
RestClient client = new RestClient("http://www.example.com/service.svc/");
RestRequest request = new RestRequest
{
Method = Method.PUT,
Resource = "Login/Email/{Email}/Password/{Password}",
RequestFormat = DataFormat.Json
};
request.AddParameter("Email", email, ParameterType.UrlSegment);
request.AddParameter("Password", password,ParameterType.UrlSegment);
client.ExecuteAsync(request, response => {
session = response.Content;
ActionCompleted(this, new System.EventArgs());
});
}
当我进行上面的调用时,我没有得到异常,只是一个空字符串返回值。在浏览器中也会发生同样的事情。我怀疑我的服务定义。我有几个问题可能有点基础,但我希望将来也能帮助其他WCF/Rest初学者。
1。我的服务定义中的UriTemplate有什么问题?一个合适的UriTemplate是什么样的?
2。对于这种服务调用,我应该使用PUT方法,还是GET或POST更合适?
3。我的web服务定义中还有什么明显缺失的吗?
4。传递完整服务uri (http://www.example.com/service.svc/)到Rest客户端是否正确?
5。对于Rest初学者有任何其他建议,特别是关于WCF-Rest组合吗?
- 如果你使用GET,一个合适的uri模板应该是这样的:
[OperationContract]
[WebGet(UriTemplate = "Book/{id}")]
Book GetBookById(string id);
VB: <OperationContract()> _
<WebGet(UriTemplate:="Book/{id}")> _
Function GetBookById(ByVal id As String) As Book
然后您可以使用http://example.com/Book/1调用ID==1的图书。
- 在微软世界中,PUT通常用于创建或更新数据,例如新任务、订单等。但是,您可以将其用于登录,即使我个人认为POST或GET将是更准确的方法。但这只是我的看法。
你的申报单好像没有遗漏什么。
如果你不能用浏览器访问它,它可能不是使用RestSharp是错误的。不过,这里有一些注意事项。当使用异步方法时,你通常会想尝试使用。net的async/wait-pattern。
您如何托管您的WCF?如果使用IIS,您的web。配置是什么样的?下面是一个例子:
查看这个问题了解更多信息:PUT和POST在REST
的例子:http://www.dosomethinghere.com/2014/08/23/vb-net-simpler-async-await-example/
下面是我在xamarin项目中用于调用服务的一小段代码:
protected static async Task<T> ExecuteRequestAsync<T>(string resource,
HttpMethod method,
object body = null,
IEnumerable<Parameter> parameters = null) where T : new()
{
var client = new RestClient("http://example.com/rest/service.svc/");
var req = new RestRequest(resource, method);
AddRequestKeys(req);
if (body != null)
req.AddBody(body);
if (parameters != null)
{
foreach (var p in parameters)
{
req.AddParameter(p);
}
}
Func<Task<T>> result = async () =>
{
var response = await client.Execute<T>(req);
if (response.StatusCode == HttpStatusCode.Unauthorized)
throw new Exception(response.Data.ToString());
if (response.StatusCode != HttpStatusCode.OK)
throw new Exception("Error");
return response.Data;
};
return await result();
}
作为旁注,我注意到您提到您需要访问wcf服务。你考虑过使用。net Web API吗?它提供了一种更直接的方法来创建RESTful端点,而不需要配置。它更容易实现和使用,但是它不提供与wcf服务相同的灵活性。
对于调试WCF服务,我强烈推荐使用"WCF测试客户端":https://msdn.microsoft.com/en-us/library/bb552364 (v = vs.110) . aspx我在哪里可以找到WcfTestClient.exe (Visual Studio的一部分)
在您的web中启用元数据。配置,您将能够看到所有可用的方法。下面的示例配置:
<configuration>
<system.serviceModel>
<services>
<service name="Metadata.Example.SimpleService">
<endpoint address=""
binding="basicHttpBinding"
contract="Metadata.Example.ISimpleService" />
</service>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
来源:https://msdn.microsoft.com/en-us/library/ms734765 (v = vs.110) . aspx
如果没有帮助,你能提供你的网址吗?配置和实现您的服务?