好的 - 我有一個可能的解決方案,它不是屢獲殊榮的優雅,但我剛剛測試過它,它的工作原理。
您可以公開一個WebMethod,該WebMethod返回對象並獲取params對象[]參數,從而允許您將任何喜歡的東西傳遞給它(或者什麼都不),並返回任何你想要的東西。這使用'anyType'類型編譯爲合法的WSDL。
如果您可以根據傳遞給此方法的參數的數量和數據類型來確定要調用哪個實際方法,則可以調用相應的方法並返回所需的任何值。
服務: -
[WebMethod]
public object Method(params object[] parameters)
{
object returnValue = null;
if (parameters != null && parameters.Length != 0)
{
if (parameters[0].GetType() == typeof(string) && parameters[1].GetType() == typeof(int))
{
return new ServiceImplementation().StringIntMethod(parameters[0].ToString(), Convert.ToInt32(parameters[1]));
}
else if (parameters[0].GetType() == typeof(string) && parameters[1].GetType() == typeof(string))
{
return new ServiceImplementation2().StringStringMethod(parameters[0].ToString(), parameters[1].ToString());
}
}
return returnValue;
}
我的測試服務實現類: -
public class ServiceImplementation
{
public string StringIntMethod(string someString, int someInt)
{
return "StringIntMethod called";
}
}
public class ServiceImplementation2
{
public float StringStringMethod(string someString, string someOtherString)
{
return 3.14159265F;
}
}
使用的例子: -
var service = new MyTestThing.MyService.WebService1();
object test1 = service.Method(new object[] { "hello", 3 });
Console.WriteLine(test1.ToString());
object test2 = service.Method(new object[] { "hello", "there" });
Console.WriteLine(test2.ToString());
我測試過這一點,它的工作原理。如果你有興趣,該WSDL是「方法」產生: -
POST /test/WebService1.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/Method"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Method xmlns="http://tempuri.org/">
<parameters>
<anyType />
<anyType />
</parameters>
</Method>
</soap:Body>
</soap:Envelope>
櫃面你想知道的,是我在工作無聊,我的心情幫助人們:)
如何你知道你的客戶端運行的是什麼版本嗎?典型的REST API將使用URL方案來區分版本。 – Alexandre
在這種情況下,將會有一個配置文件,在安裝過程中,用戶將被要求輸入產品版本(與API版本或WSDL綁定)。也就是說,我試圖通過擁有一個EndPoint來實現這一點。主要的問題是版本之間的WSDL有巨大的變化。 –
ASMX是一項傳統技術,不應該用於新開發。 WCF或ASP.NET Web API應該用於Web服務客戶端和服務器的所有新開發。一個暗示:微軟已經在MSDN上退役了[ASMX Forum](http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)。 –