我正在尝试使用HTTP Web服务返回由C#Desktop应用程序中的DataContractSerializer生成的XML。该服务的链接没有任何aspx或svc扩展,并且链接中需要参数。
https://sourcesite.com/api/external/v1/Snapshot?isConfirmed= {isConfirmed}&安培; sinceDate = {sinceDate}&安培; PAGENUMBER = {PAGENUMBER}&安培; recordsPerPage = {recordsPerPage}
当我在浏览器中使用它时(在提供适当的参数值之后)它可以工作。当它第一次运行时,它询问了我接受的凭据,并且即使在浏览器重启后也没有再询问。
我尝试添加网络参考(使用VS2013),使用没有参数的网址但我收到错误:
The remote server returned an unexpected response: (405) Method Not Allowed.
如果我添加硬编码参数,我会得到:
The document at the url https://sourcesite.com/api/external/v1/Snapshot?isConfirmed=True was not recognized as a known document type.
The error message from each known type may help you fix the problem:
- Report from 'XML Schema' is 'Data at the root level is invalid. Line 1, position 1.'.
- Report from 'DISCO Document' is 'Data at the root level is invalid. Line 1, position 1.'.
- Report from 'WSDL Document' is 'There is an error in XML document (1, 1).'.
- Data at the root level is invalid. Line 1, position 1.
Metadata contains a reference that cannot be resolved: 'https://sourcesite.com/api/external/v1/Snapshot?isConfirmed=True'.
The remote server returned an unexpected response: (405) Method Not Allowed.
The remote server returned an error: (405) Method Not Allowed.
If the service is defined in the current solution, try building the solution and adding the service reference again.
服务配置错误,或者我遗失了什么?也许有一种不同的方式从代码连接到这个服务?
答案 0 :(得分:0)
“添加服务引用”和“添加Web引用”适用于SOAP Web服务。
您必须使用WebClient
课程并“自己动手”。
答案 1 :(得分:0)
我终于让它工作了:
var netCred = new NetworkCredential { UserName = "user1", Password = @"pass1" };
WebClient proxy = new WebClient();
proxy.Credentials = netCred;
//Method 1 - Newtonsoft.Json
string serviceURL =
string.Format("https://sourcesite.com.com/api/external/v1/Snapshot-Accrual?isConfirmed="
+ Confirmed.ToString() + "&sinceDate=" + String.Format("{0:yyyy-MM-dd}", SinceDate);
data = proxy.DownloadData(serviceURL);
jsonString = Encoding.ASCII.GetString(data);
ac1 = Newtonsoft.Json.JsonConvert.DeserializeObject<SnapshotAccruals>(jsonString);
现在如果我只知道如何提示凭证而不是硬编码,我就会被设置。我知道如果我将serviceURL直接粘贴到浏览器中,它会询问我的凭据。如果我在代码中省略它们(401)未经授权。