в viewDidLoad добавляют эту строку
yourUiTextField.becomeFirstResponder()
Принято ли оставаться с ASMX в "старом стиле"? Или вы могли бы перейти в WCF? Это действительно самый современный веб-сервис от Microsoft, и если вы делаете что-то новое и используете .NET 3.0 или выше - зачем тратить время на «старые» технологии?
В WCF вы определенно могли определить статический физический файл WSDL, который будет использоваться клиентами, подключающимися к вашей конечной точке метаданных (ваш URL-адрес "...? Wsdl"). Не уверен, что вы можете сделать это и в ASMX.
Хорошо, в ASMX / .NET 2.0 вы, конечно, всегда можете поместить настоящий WSDL-файл в корень вашего веб-сайта, а затем просто сослаться на него следующим образом:
http://yourwebserver/YourVirtDir/MyService.wsdl
Я не знаю, есть ли способ «перенаправить» вызов
http://yourwebserver/YourVirtDir/MyService.asmx?wsdl
, чтобы вместо этого перейти на этот фиксированный URL. Я уверен, что кто-нибудь еще узнает!
Марк
Вы можете сгенерировать файл WSDL и DISCO, указав инструмент disco.exe , который поставляется с .NET Framework на вашем веб-сервисе.
disco.exe http://webserver/MyWebService.asmx
Следующие файлы: создано:
results.discomap
MyWebService.disco
MyWebService.wsdl
Чтобы избежать путаницы с наличием двух разных WSDL по двум разным URL-адресам (т. Е. URL-адрес * .asmx? Wsdl и настраиваемый URL-адрес) в приложении веб-службы, вы можете написать HttpModule который перехватывает запрос к URL-адресу * .asmx? wsdl и вместо этого возвращает ваш собственный WSDL.
РЕДАКТИРОВАТЬ: Вот пример, адаптированный и упрощенный из некоторого кода, который я ранее написал, который делает настраиваемый WSDL доступным по стандарту * .asmx? wsdl URL.
using System;
using System.IO;
using System.Web;
using System.Web.Services.Configuration;
namespace DemoWebService
{
public class CustomWsdlModule :
IHttpModule
{
public void
Init(HttpApplication application)
{
// hook up to BeginRequest event on application object
application.BeginRequest += new EventHandler(this.onApplicationBeginRequest);
}
public void
Dispose()
{
}
private void
onApplicationBeginRequest(object source, EventArgs ea)
{
HttpApplication application = (HttpApplication)source;
HttpRequest request = application.Request;
HttpResponse response = application.Response;
// check if request is for WSDL file
if ( request.Url.PathAndQuery.EndsWith(".asmx?wsdl", StringComparison.InvariantCultureIgnoreCase) )
{
// if Documentation protocol is not allowed, throw exception
if ( (WebServicesSection.Current.EnabledProtocols & WebServiceProtocols.Documentation) == 0 )
{
throw new System.InvalidOperationException("Request format is unrecognized.");
}
// get path to physical .asmx file
String asmxPath = request.MapPath(request.Url.AbsolutePath);
// build path to .wsdl file; should be same as .asmx file, but with .wsdl extension
String wsdlPath = Path.ChangeExtension(asmxPath, ".wsdl");
// check if WSDL file exists
if ( File.Exists(wsdlPath) )
{
// read WSDL file
using ( StreamReader reader = new StreamReader(wsdlPath) )
{
string wsdlFileContents = reader.ReadToEnd();
// write WSDL to response and end response without normal processing
response.ContentType = "text/xml";
response.Write(wsdlFileContents);
response.End();
}
}
}
}
}
}
Этот упрощенный код предполагает, что ваш пользовательский WSDL находится в той же папке, что и ваш файл .asmx с расширением .wsdl. HttpModule необходимо подключить к вашему приложению веб-службы через файл web.config:
<?xml version="1.0"?>
<configuration>
<!-- ... -->
<system.web>
<!-- ... -->
<httpModules>
<add
type="DemoWebService.CustomWsdlModule"
name="CustomWsdlModule"/>
<!-- ... -->
</httpModules>
<!-- ... -->
</system.web>
<!-- ... -->
</configuration>