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组合吗?

Xamarin表单的Rest + WCF集成

  1. 如果你使用GET,一个合适的uri模板应该是这样的:
c#

[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将是更准确的方法。但这只是我的看法。

查看这个问题了解更多信息:PUT和POST在REST

  • 你的申报单好像没有遗漏什么。

  • 如果你不能用浏览器访问它,它可能不是使用RestSharp是错误的。不过,这里有一些注意事项。当使用异步方法时,你通常会想尝试使用。net的async/wait-pattern。

  • 的例子: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?如果使用IIS,您的web。配置是什么样的?下面是一个例子:

  • 作为旁注,我注意到您提到您需要访问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

    如果没有帮助,你能提供你的网址吗?配置和实现您的服务?