【问题标题】:Web API and WPF clientWeb API 和 WPF 客户端
【发布时间】:2013-11-14 10:54:01
【问题描述】:

我按照以下文章设置了一个简单的 Web API 解决方案: http://www.codeproject.com/Articles/350488/A-simple-POC-using-ASP-NET-Web-API-Entity-Framewor

我省略了 Common 项目、Log4Net 和 Castle Windsor,以使项目尽可能简单。

然后我创建了一个 WPF 项目。但是,现在我应该参考哪个项目来访问 WebAPI 和底层模型?

【问题讨论】:

  • 使用 httpwebrequest 类向 webapi 发出请求。您不能像通常使用 WCF 服务那样向该项目添加服务引用。但是有一个名为“Microsoft ASP.NET Web API 客户端库”link 的 WebAPI 客户端 nuget 包

标签: c# wpf asp.net-web-api


【解决方案1】:

使用 HttpWebRequest 类向 Web API 发出请求。下面是我用来向其他一些 RESTful 服务发出请求的快速示例(该服务只允许 POST/GET,而不是 DELETE/PUT)。

        HttpWebRequest request = WebRequest.Create(actionUrl) as HttpWebRequest; 
        request.ContentType = "application/json";

        if (postData.Length > 0)
        {
            request.Method = "POST"; // we have some post data, act as post request.

            // write post data to request stream, and dispose streamwriter afterwards.
            using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
            {
                writer.Write(postData);
                writer.Close();
            }
        }
        else
        {
            request.Method = "GET"; // no post data, act as get request.
            request.ContentLength = 0;
        }

        string responseData = string.Empty;

        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                responseData = reader.ReadToEnd();
                reader.Close();
            }

            response.Close();
        }

        return responseData;

还有一个名为“Microsoft ASP.NET Web API 客户端库”的 nuget 包可用,可用于向 WebAPI 发出请求。更多关于这个包的信息(http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client)

【讨论】:

  • 如果我添加对我的 AppModel.dll 的引用,我应该有我的实体。但是我也可以访问 dbcontext,这可能不是一个好主意。
  • 我猜不是。由于您使用的是 webapi,因此如果您想在应用程序的每个部分中使用服务层,则不应直接引用数据模型项目。在不同的项目中创建一些代理模型,并将来自 webapi 请求的 json 绑定到这些模型并在您的表示层中使用它们。