带有 Web 服务的 Web API
Posted
技术标签:
【中文标题】带有 Web 服务的 Web API【英文标题】:Web API with web services 【发布时间】:2014-11-10 14:35:31 【问题描述】:我编写了以下代码来调用 Web 服务数据输出并且它有效。问题是当我在 Web 软件上激活 api 密钥并生成此密钥时,调用 Web 服务并需要创建一个 api 客户端通过 httpRequest 请求这个,但是每当我运行它时我的问题是“远程服务器返回错误:(404)未找到。”你有什么主意吗?我将整个代码粘贴在下面。
非常感谢您
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DisplayDataInformation
public partial class DisplayDataInformation : Form
public DisplayDataInformation()
InitializeComponent();
private void Submit(object sender, EventArgs e)
localhost.Dashboard proxy = new localhost.Dashboard();
localhost.ProjectMetaData[] pm = proxy.GetAllProjectMetaData();
const string URL = "http://localhost/myProgram/";
const string apiKey = "d26b15b5-e336-48de-9142-939c0e639e8f";
const string Id = "Id";
const string Pass = "pass";
System.Net.HttpWebRequest myHttpWReq;
System.Net.HttpWebResponse myHttpWResp;
//myHttpWReq.ContentLength = 0;
// Make a web request to the web service
myHttpWReq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(BLUEURL + "http://localhost/myProgram/Dashboard.asmx" + Id + Pass + apiKey);
myHttpWReq.Method = "Get";
// Get the response of the web service
myHttpWResp = (System.Net.HttpWebResponse)myHttpWReq.GetResponse();
if (myHttpWResp.StatusCode == System.Net.HttpStatusCode.OK)
//Create an XML reader to parse the response
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(myHttpWResp.GetResponseStream());
//set an string output to the windows form
StringBuilder sb = new StringBuilder();
foreach (localhost.ProjectMetaData value in pm)
sb.AppendLine(value.ProjectTitle + " - "
+ value.ProjectID + " - "
+ value.PublishStatus );
// sb.AppendLine("\r\n\t");
label1.Text = sb.ToString();
【问题讨论】:
【参考方案1】:看起来您最喜欢错误地生成请求 URL。您已经创建了这样的:
myHttpWReq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(BLUEURL + "http://localhost/myProgram/Dashboard.asmx" + Id + Pass + apiKey);
此代码生成的 URL 将是:
http://localhost/myProgram/Dashboard.asmxIdPassd26b15b5-e336-48de-9142-939c0e639e8f
(注意:我在您的代码示例中找不到变量 BLUEURL 的值,但无论它是什么,它都会为您生成的 URL 加上前缀。我最好的猜测是它是空白的,否则您会得到一个UriFormatException.)
这看起来不像您所追求的正确 URL,因此出现 404 错误。你可能追求的是:
myHttpWReq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(String.Format("http://localhost/myProgram/Dashboard.asmx?id=0&pass=1&apiKey=2", Id, Pass, apiKey));
这会将请求发送到 URL
http://localhost/myProgram/Dashboard.asmx
在查询字符串中发送您的参数。
但是这可能仍然会给您一个错误,因为您正在尝试调用 asmx Web 服务,它是一个基于 XML 的 Web 服务,因此您的请求格式错误。
This tutorial 将向您展示如何将 Dashboard.asmx Web 服务作为服务引用添加到您的项目中。这将自动生成一个代理类,它将为您将所有对 Web 服务的调用包装成简单的函数调用。
已阅读以下答案以获得有关如何添加参考的更多帮助:
Web Reference vs. Service Reference How to add a Web reference Visual Studio 2012 How to use a WSDL calling asmx from c# server side: endpoint element matching this contract could be found in the client element【讨论】:
您好,感谢您的回答。我做了你给我的改变,但现在它给了我另一个错误远程服务器返回一个错误:(500)内部服务器错误。 再次嗨!,我终于可以通过这样做 myHttpWReq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(String.Format("localhost/BlueWebService55/Dashboard.asmx?id=0 &pass=1&apiKey=2", BlueId, BluePass, apiKey) + GetAllProjectMetaData);我创建了一个名为 string GetAllProjectMetaData = ""; 但问题是当我调用 Web 服务时没有显示任何内容,它表明我的客户端没有使用该方法。在 Web 应用程序中,有一个调用 GetAllProjectMetaData 的选项方法,但从我的应用程序中它不这样做 我已经更新了我的答案,包括一些关于调用 asmx Web 服务的最佳方式的说明。如果您仍然卡住,可能值得您对 asmx Web 服务进行一些研究。 您好,再次感谢您的回答。根据教程,这就是如何添加一个已经完成的网络参考。我能够毫无问题地使用网络服务。当我在有问题的 Web 服务中启用 api 密钥时,问题开始发生,因此当我的客户端在没有 api 密钥的情况下工作时,这将启用安全性并调用和使用 Web 服务不会以相同的方式工作,它仅使用代理和 foreach 循环 ao 我正在显示所有内容。谢谢 我不确定我是否关注您的问题。在我看来,您有一个可以使用代理生成的类成功调用的 Web 服务。您是否尝试通过使其需要 API 密钥来在 Web 服务上实现安全机制?还是这种安全机制已经存在?无论哪种方式,听起来这个问题都偏离了我相信我已经回答的原始问题的主题。以上是关于带有 Web 服务的 Web API的主要内容,如果未能解决你的问题,请参考以下文章