Just as there's nothing stopping you from writing code to handle HTTP requests from scratch, you could handle Web service requests from handwritten code. You could write a Web service armed with a only a decent XML parser and a socket library (for communicating over your server's communication ports). The work involved includes the following:
Listening to port 80 to receive method calls
Parsing the incoming XML stream, unpacking the parameters
Setting up the incoming parameters and performing the work
Packing a suitable XML SOAP response and sending it to the caller
Advertising the service's capabilities via WSDL
After the second or third time implementing a service by hand, you'd probably come to the following conclusion. Much of the work involved in making a Web service work is repetitive and might as well be pushed into a library. That's exactly what ASP.NET does. ASP.NET will handle the details of making a Web service through the System.Web.Services.Service class.